プロが教えるわが家の防犯対策術!

初歩的な質問なのですが、今各関数をファイルごとに分けて記述しようとしています。
ここで詰まっているのでできればご教授お願いします

ファイル構成は
プログラムファイル main.cpp sub.cpp
ヘッダーファイル  myheader.h(main.cppとsub.cpp両方でインクルード)

ヘッダーファイルには両方のプログラムファイルで使う変数が定義してあります。
それでmain.cppとsub.cpp両方で同じ変数を使いたいのですがコンパイルエラーが発生してしまいます。
内容はsub.obj側で「i(共通のループカウンタ)はmain.objですでに定義されています」というものです。

とにかく私のやりたいことはヘッダーに外部変数を定義して両方のプログラムファイルで使いたいというものです。
もしかしたらファイルを分けるにも何か設定が必要なのでしょうか?
私はただ[プロジェクト]→[プロジェクトに追加]→[新規作成]でソースファイルを作っているだけなんですが・・・
上記の状態を回避する方法はあるのでしょうか?

A 回答 (3件)

myheader.h内で変数を定義したのでは、main.cppとsub.cppの両方で変数が定義されることになります。

ヘッダファイル内では宣言のみにしてください。具体的には、myheader.h内では「extern int i;」のように宣言し、main.cppかsub.cppのどちらか一方で「int i;」と定義してください。これでエラーがでなくなるはずです。

#ただし、ループカウンタをグローバル変数にするのはどうかと思いますが...。
    • good
    • 0
この回答へのお礼

gimmickさん、ありがとうございます
無事コンパイルが通りました^^

しかし・・・ヘッダーファイルでは宣言だけしかしてはいけないのでしょうか?
それとプログラムファイルの中でもう一度定義しなおすのはなぜなんでしょうか?

たぶんこれもC言語では基礎的なものだとは思うのですがそちらも教えてもらえないでしょうか?
または解説ページなどがあれば紹介だけでもお願いします
今から自分でも調べてみるつもりです

>#ただし、ループカウンタをグローバル変数にするのはどうかと思いますが...。
あ、これは例えであって実際にはしてません(^-^;

お礼日時:2002/10/14 18:49

>ヘッダーファイルでは宣言だけしかしてはいけないのでしょうか?



通常、ヘッダファイルでは変数の定義は行いません。複数のファイルからインクルードされた場合に重複定義のエラーとなるからです。そのため、ヘッダファイル内では宣言のみを行います。しかし、これだけだと変数の定義がありません。そのため、どこかで定義を記述する必要があります。

>または解説ページなどがあれば紹介だけでもお願いします

適当なページが思いつかないのですが、1つだけ挙げておきます。

参考URL:http://www.catnet.ne.jp/kouno/c_faq/c1.html#7
    • good
    • 0

main.cpp:


#define MAIN
#include "myheader.h"

sub.cpp
#include "myheader.h"

myheader.h:
#ifdef MAIN
#define PUBLIC
#else
#define PUBLIC extern
#endif
PUBLIC int i;

これでどうでしょう。

カウンタのグローバル定義はいかがなものか?という論議の前に、ヘッダファイルをいじるならプリプロセッサ構文を理解しましょう。
プリプロセッサ構文、記憶クラスの機能を知れば「なぜカウンタをグローバル定義しない方が良いか」がわかるはずです。
もちろん、カウンタをグローバル定義した方が良いこともあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!