.h

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

.h

#1

投稿記事 by うい » 16年前

自分で新しく.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

#2

投稿記事 by うい » 16年前

今自分なりに対処したところ、上のようなエラーは消えましたが、次のようなエラーが出るようになってしまいました。

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

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

conio

Re:.h

#3

投稿記事 by conio » 16年前

エラーに書いてある通り、"black"が重複定義されているからだと思います。

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

うい

Re:.h

#4

投稿記事 by うい » 16年前

そうならないように
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

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

YuO

Re:.h

#5

投稿記事 by YuO » 16年前

> とやっていて、他ではこれをしていないので、重複している原因がわからないです。

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


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

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

初級者

Re:.h

#6

投稿記事 by 初級者 » 16年前

そもそも
black=(0,0,0)
という初期化はできるのでしょうか?
文法と合っていないように見えます。

たかぎ

Re:.h

#7

投稿記事 by たかぎ » 16年前

> black=(0,0,0)
> という初期化はできるのでしょうか?
> 文法と合っていないように見えます。

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

初級者

Re:.h

#8

投稿記事 by 初級者 » 16年前

あ、そうでした。
まあ、仮にRGBの初期化をしたいのだとすると、
正しくないことには変わりないのですけれど。

Dixq (管理人)

Re:.h

#9

投稿記事 by Dixq (管理人) » 16年前

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

#10

投稿記事 by うい » 16年前

了解です、ありがとうございます。

ななし

Re:.h

#11

投稿記事 by ななし » 16年前

main では、ちゃんとヘッダをインクルードする前に GLOBAL_INSTANCE を定義していますか?
他のファイルをインクルードした際にそのヘッダをインクルードしている可能性もあるので、main のファイルの先頭で GLOBAL_INSTANCE を定義した方が良さそうです。

閉鎖

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