ページ 11

.h

Posted: 2008年12月12日(金) 00:05
by うい
自分で新しく.hをつくり、それをほかのやつとおなじとこに入れてちゃんとincludesしているのですが、どうも反映されてないみたいです。

.hの内容は
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif


#include "struct.h"

GLOBAL int black=(0,0,0);


これでほかの関数でblackという色を使おうとしているのですが
'black' : 定義されていない識別子です。
と出てしまいます。

Re:.h

Posted: 2008年12月12日(金) 00:35
by うい
今自分なりに対処したところ、上のようなエラーは消えましたが、次のようなエラーが出るようになってしまいました。

int black" (?black@@3HA) は既に main.obj で定義されています。
fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

どのように対処したらよろしいかアドバイスもらえるとうれしいです。

Re:.h

Posted: 2008年12月12日(金) 00:52
by conio
エラーに書いてある通り、"black"が重複定義されているからだと思います。

現在はファイルがどうなっているのかは分かりませんが、
複数のファイルにまたがって、"black"の定義をしていませんか?

Re:.h

Posted: 2008年12月12日(金) 00:56
by うい
そうならないように
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

で場合分けし、mainのときにはちゃんと
#define GLOBAL_INSTANCE
とやっていて、他ではこれをしていないので、重複している原因がわからないです。

Re:.h

Posted: 2008年12月12日(金) 03:10
by YuO
> とやっていて、他ではこれをしていないので、重複している原因がわからないです。

せっかくこうやっても,定義をしてしまっているからです。


> GLOBAL int black=(0,0,0);

extern int black=(0,0,0);
と展開されたとしても,初期化子があるので宣言ではなく定義になります。

Re:.h

Posted: 2008年12月12日(金) 07:34
by 初級者
そもそも
black=(0,0,0)
という初期化はできるのでしょうか?
文法と合っていないように見えます。

Re:.h

Posted: 2008年12月12日(金) 07:52
by たかぎ
> black=(0,0,0)
> という初期化はできるのでしょうか?
> 文法と合っていないように見えます。

できます。
二つの , はコンマ演算子ですので、最後の(一番右の)0でblackが初期化されます。

Re:.h

Posted: 2008年12月12日(金) 08:05
by 初級者
あ、そうでした。
まあ、仮にRGBの初期化をしたいのだとすると、
正しくないことには変わりないのですけれど。

Re:.h

Posted: 2008年12月12日(金) 13:57
by Dixq (管理人)
blackにはGetColor(0,0,0)みたいなものが入れたかったんですかね?
頑張ったら以下のように宣言と同時に格納することもできますが、
初期化や初期設定をする為の関数を作った方がいいと思います。
ちなみに0なら自動的に入るので入れる必要はないです。
(例)

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#define GLOBAL_VAL(v)	 =(v)
#define GLOBAL_ARR2(a,b) ={a,b}
#else
#define GLOBAL extern 
#define GLOBAL_VAL(v)	 
#define GLOBAL_ARR2(a,b)	 
#endif


GLOBAL int black    GLOBAL_VAL(1);//1を格納
GLOBAL int color[2] GLOBAL_ARR2(2,3);//[0]に2,[1]に3を格納
 

Re:.h

Posted: 2008年12月13日(土) 04:18
by うい
了解です、ありがとうございます。

Re:.h

Posted: 2008年12月13日(土) 14:07
by ななし
main では、ちゃんとヘッダをインクルードする前に GLOBAL_INSTANCE を定義していますか?
他のファイルをインクルードした際にそのヘッダをインクルードしている可能性もあるので、main のファイルの先頭で GLOBAL_INSTANCE を定義した方が良さそうです。