複数回定義のシンボル

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
s-rush

複数回定義のシンボル

#1

投稿記事 by s-rush » 16年前

いつもお世話になっています。

龍神録プログラミング 5章”宣言の仕方を工夫しよう”を参考に、
今制作中のゲームの宣言・定義のあたりを見やすく改良しました。

まだ、
#ifdef GLOBAL_INSTANCE
 #define GLOBAL
 #else
 #define GLOBAL extern 
 #endif
のようなifdefの使い方が分かっていなかったので、
エラーがとんでもない数(300以上)出てしまいました^^;

自力でエラー数を4まで減らすことができたのですが、残りのエラーがどうしても消えません。
GV.h内でのincludeのタイミングに問題があるのかな?って思い、
その周りを調べている途中です。

ですが、原因がわかりません。
どうかお力をお貸しください。


エラー内容
1>get_time.obj : error LNK2005: "struct ST_WORD * word_table" (?word_table@@3PAUST_WORD@@A) は既に main.obj で定義されています。
1>graph_input_name.obj : error LNK2005: "struct ST_WORD * word_table" (?word_table@@3PAUST_WORD@@A) は既に main.obj で定義されています。
1>input_name_calc.obj : error LNK2005: "struct ST_WORD * word_table" (?word_table@@3PAUST_WORD@@A) は既に main.obj で定義されています。
1>C:\Documents and Settings\kida\My Documents\Visual Studio 2008\Projects\pokemon1\Debug\pokemon1.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。


開発環境
VC++ 2008 EE
DXライブラリ使用
OS: XP及びVista

ソースのみ添付しておきますのでよろしくお願いします。

ねこ

Re:複数回定義のシンボル

#2

投稿記事 by ねこ » 16年前

どこかでword_table.hを重複してincludeしてます。
word_table.hファイルの一番上に「#pragma once」と入れると解決するかも。

s-rush

Re:複数回定義のシンボル

#3

投稿記事 by s-rush » 16年前

>>ねこさん
#pragma onceをword_table.hの一番上に入れてみましたが、
変化がありませんでした。

御津凪

Re:複数回定義のシンボル

#4

投稿記事 by 御津凪 » 16年前

Ctrl + Shift + F (編集->検索と置換->フォルダを指定して選択)で、
word_table を検索(検索対象は ソリューション全体 で)してみてください。

もしかしたらどこかで同じ定義をしているかもしれません。

ねこ

Re:複数回定義のシンボル

#5

投稿記事 by ねこ » 16年前

あーすいません。「#pragma once」じゃ駄目ですね。
word_table.hの中をこう書き換えてみてください

#ifdef GLOBAL_INSTANCE
// ※今ある定義
#else
extern ST_WORD word_table[77];
#endif

externでも配列の中を宣言時に設定してるのでエラーでてます。

やそ

Re:複数回定義のシンボル

#6

投稿記事 by やそ » 16年前

できれば、ちゃんと検索をかけて、重複している定義をみつけて、
直したほうがいいですよ^^

s-rush

Re:複数回定義のシンボル

#7

投稿記事 by s-rush » 16年前

>>御津凪さん
>>やそさん
一応ソリューション全体で検索はかけています。
(はじめに書いておくべきでした^^;)
ですが、重複らしき箇所が見つかりませんでした。
キーワードとしては”ST_WORD””word_table””word_table.h”
の3つを試しました。

>>ねこさん
今はプログラムができる環境下ではないので、明日試して見ます。

御津凪

Re:複数回定義のシンボル

#8

投稿記事 by 御津凪 » 16年前

添付ファイルの中身を見てなかったので上のことを書いていましたが、
中身を見てみたところ、 extern 指定しながらの定義となっていますね。
#ifdef GLOBAL_INSTANCE
#include "word_table.h"
#else
GLOBAL ST_WORD word_table[77];
#endif
と色つきの部分で囲んでみてください。これで通るはずです。


あるいは、word_table.h の中身を、
GLOBAL ST_WORD word_table[77]
#ifdef GLOBAL_INSTANCE
={
    //1行目
/* --中略-- */
    {-1, -1, "", "", ""}
}
#endif
;
としてもいけます。(見た目悪いですが)

s-rush

Re:複数回定義のシンボル

#9

投稿記事 by s-rush » 16年前

>>御津凪さん
#ifdef GLOBAL_INSTANCE
#include "word_table.h"
#else
GLOBAL ST_WORD word_table[77];
#endif
を書き込むことで解決しました。

ところで、
>extern 指定しながらの定義となっていますね
というのはどういうことなのでしょうか??
これが二重に定義されているということなんですか?

御津凪

Re:複数回定義のシンボル

#10

投稿記事 by 御津凪 » 16年前

extern を指定するのは、「外部へ公開する」ことに関する設定を行うものです。

例を挙げると、

extern int gIntData;

とするだけの場合、その値が存在するという宣言だけで実体は無いため、
コンパイルは成功しますがリンクエラーとなります。

extern int gIntData = 10;

と、初期値を代入すると、実体が存在してしまうので、
(他のヘッダなどから複数コンパイルされなければ)問題なくリンクできます。

今回の場合、extern と共に配列を定義しているので、各コンパイル時に同じ名前の実体が存在してしまい、
エラーとなっています。

s-rush

Re:複数回定義のシンボル

#11

投稿記事 by s-rush » 16年前

なるほど。
つまり、externをしておきながら初期値を設定していて、
かつほかのヘッダでも読み込んでいるため複数定義となっている・・・

という感じですかね。


なんとなくわかりました。
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る