- 締切済み
複数ファイルによる共通の外部変数定義について
初歩的な質問なのですが、今各関数をファイルごとに分けて記述しようとしています。 ここで詰まっているのでできればご教授お願いします ファイル構成は プログラムファイル main.cpp sub.cpp ヘッダーファイル myheader.h(main.cppとsub.cpp両方でインクルード) ヘッダーファイルには両方のプログラムファイルで使う変数が定義してあります。 それでmain.cppとsub.cpp両方で同じ変数を使いたいのですがコンパイルエラーが発生してしまいます。 内容はsub.obj側で「i(共通のループカウンタ)はmain.objですでに定義されています」というものです。 とにかく私のやりたいことはヘッダーに外部変数を定義して両方のプログラムファイルで使いたいというものです。 もしかしたらファイルを分けるにも何か設定が必要なのでしょうか? 私はただ[プロジェクト]→[プロジェクトに追加]→[新規作成]でソースファイルを作っているだけなんですが・・・ 上記の状態を回避する方法はあるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- toysmith
- ベストアンサー率37% (570/1525)
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; これでどうでしょう。 カウンタのグローバル定義はいかがなものか?という論議の前に、ヘッダファイルをいじるならプリプロセッサ構文を理解しましょう。 プリプロセッサ構文、記憶クラスの機能を知れば「なぜカウンタをグローバル定義しない方が良いか」がわかるはずです。 もちろん、カウンタをグローバル定義した方が良いこともあります。
- gimmick
- ベストアンサー率49% (134/270)
>ヘッダーファイルでは宣言だけしかしてはいけないのでしょうか? 通常、ヘッダファイルでは変数の定義は行いません。複数のファイルからインクルードされた場合に重複定義のエラーとなるからです。そのため、ヘッダファイル内では宣言のみを行います。しかし、これだけだと変数の定義がありません。そのため、どこかで定義を記述する必要があります。 >または解説ページなどがあれば紹介だけでもお願いします 適当なページが思いつかないのですが、1つだけ挙げておきます。
- gimmick
- ベストアンサー率49% (134/270)
myheader.h内で変数を定義したのでは、main.cppとsub.cppの両方で変数が定義されることになります。ヘッダファイル内では宣言のみにしてください。具体的には、myheader.h内では「extern int i;」のように宣言し、main.cppかsub.cppのどちらか一方で「int i;」と定義してください。これでエラーがでなくなるはずです。 #ただし、ループカウンタをグローバル変数にするのはどうかと思いますが...。
お礼
gimmickさん、ありがとうございます 無事コンパイルが通りました^^ しかし・・・ヘッダーファイルでは宣言だけしかしてはいけないのでしょうか? それとプログラムファイルの中でもう一度定義しなおすのはなぜなんでしょうか? たぶんこれもC言語では基礎的なものだとは思うのですがそちらも教えてもらえないでしょうか? または解説ページなどがあれば紹介だけでもお願いします 今から自分でも調べてみるつもりです >#ただし、ループカウンタをグローバル変数にするのはどうかと思いますが...。 あ、これは例えであって実際にはしてません(^-^;