C言語関係掲示板

過去ログ

No.1000 宣言がダブる

[戻る] [ホームページ]
No.858

宣言がダブる
投稿者---ねこ(2003/12/18 20:03:50)


こんにちは。
VC++で、Win32コンソールアプリケーションを作成し、
"main.cpp"、"main2.cpp"、"main.h"を作りました。
-----main.cpp-----
#include "main.h"

extern void funcHoge(void);

void main()
{
X=5;
printf("%d\n",X);
funcHoge();
printf("%d\n",X);
}
-------------------

-----main2.cpp-----
#include "main.h"

extern int X;
void funcHoge(void)
{
printf("%d\n",X);
X=4;
}
----------------

-----main.h-----
#include <stdio.h>

//#ifndef HEADER
//#define HEADER
int X=3;
//#endif
----------------

これをビルドすると、
「"int X" (?X@@3HA) はすでに main.obj で定義されています」
と、エラーが出ます。
"main.h"を"main.cpp"と"main2.cpp"の両方でインクルードしているので、
Xの宣言がダブったのかなと思い、"main.h"のコメントを外しました。
ところが、それでもまだ、同じエラーが出るのですが、
どうすればよいのでしょうか?
やりたいことは、Xをプロジェクトでのグローバル変数にして、
#include <stdio.h> をすべてのcppファイルに書くことを省きたいだけなのですが・・・。

どうぞよろしくお願いいたします。

No.859

Re:宣言がダブる
投稿者---YuO(2003/12/18 20:36:07)


>"main.h"を"main.cpp"と"main2.cpp"の両方でインクルードしているので、
>Xの宣言がダブったのかなと思い、"main.h"のコメントを外しました。
>ところが、それでもまだ、同じエラーが出るのですが、
>どうすればよいのでしょうか?

インクルードガードは一つの翻訳単位でのみの物です。

でもって,ヘッダファイルに変数の定義を書いてはいけません。
ヘッダには
extern int X;
と書いて,
main2.cppで
int X;
のようにしてやります。


No.862

Re:宣言がダブる
投稿者---nop(2003/12/19 00:20:11)


Cプログラミング診断室の第5章辺りが参考になるかと。

後、Cにおけるコンパイル・リンクの課程と、
プリプロセッサについて勉強した方が良いでしょう。

No.869

Re:宣言がダブる-解決
投稿者---ねこ(2003/12/19 16:57:55)


YuO様、nop様
ありがとうございます。

・変数
・関数
・構造体
をグローバルで使う時は、cppファイルの方に実体を、
ヘッダーファイルの方にexternを書けばよいのですね!

「Cプログラミング診断室」は、5章まで読んでみましたが、
いまいち理解できないところも多く・・・。
でも、きっと、そのうち役に立つであろうサイトを教えてくださいまして、
ありがとうございました。

No.871

Re:宣言がダブる-解決
投稿者---NykR(2003/12/19 18:49:06)


ちなみに(わかってらっしゃるかもしれませんが)
Cプログラミング診断室の第5章では
main.hを
----------------------------------
#include <stdio.h>

#ifndef HEADER
#define HEADER

#ifdef GLOBAL_VARIABLE_DEFINE
#define GLOBAL
#else
#define GLOBAL extern
#endif

GLOBAL int X=3;

#endif
----------------------------------

のように書き
main.cppではmain.hをインクルードする前に
#define GLOBAL_VARIABLE_DEFINE
を書いておいて、ほかのファイルでは書かないようにすると、
自動的にグローバル変数は、main.cppだけで定義され、
ほかの所ではextern宣言になり、しかも書くのは宣言と定義をあわせて一回だけで済む
ということを言っています。

No.872

Re:宣言がダブる-解決
投稿者---NykR(2003/12/19 19:12:26)


GLOBAL int X=3

やっちまった。

GLOBAL int X
#ifdef GLOBAL_VARIABLE_DEFINE
=3;
#endif

ですね。

それか

#define GLOBAL_VAL(v) = (v)
#define GLOBAL_VAL(v)

というのを入れておいて、っていうか5章。

No.873

Re:宣言がダブる-解決
投稿者---ねこ(2003/12/19 20:42:18)


NykR様

ありがとうございます。
この部分は何とか自力で解読いたしました。
なるほどなぁ〜とは思ったのですが、なんと言うか、
自分が書いたソースは、きっと「下手くそ」なため、この部分だけが
「上手い」書き方で、浮いているような気がします・・・。

No.880

Re:宣言がダブる-解決
投稿者---NykR(2003/12/20 10:16:37)


GLOBAL int X
#ifdef GLOBAL_VARIABLE_DEFINE
=3;
#endif


あ、、、セミコロンは外です。