初歩的な質問なのですが、今各関数をファイルごとに分けて記述しようとしています。
ここで詰まっているのでできればご教授お願いします
ファイル構成は
プログラムファイル main.cpp sub.cpp
ヘッダーファイル myheader.h(main.cppとsub.cpp両方でインクルード)
ヘッダーファイルには両方のプログラムファイルで使う変数が定義してあります。
それでmain.cppとsub.cpp両方で同じ変数を使いたいのですがコンパイルエラーが発生してしまいます。
内容はsub.obj側で「i(共通のループカウンタ)はmain.objですでに定義されています」というものです。
とにかく私のやりたいことはヘッダーに外部変数を定義して両方のプログラムファイルで使いたいというものです。
もしかしたらファイルを分けるにも何か設定が必要なのでしょうか?
私はただ[プロジェクト]→[プロジェクトに追加]→[新規作成]でソースファイルを作っているだけなんですが・・・
上記の状態を回避する方法はあるのでしょうか?
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
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;
これでどうでしょう。
カウンタのグローバル定義はいかがなものか?という論議の前に、ヘッダファイルをいじるならプリプロセッサ構文を理解しましょう。
プリプロセッサ構文、記憶クラスの機能を知れば「なぜカウンタをグローバル定義しない方が良いか」がわかるはずです。
もちろん、カウンタをグローバル定義した方が良いこともあります。
No.2
- 回答日時:
>ヘッダーファイルでは宣言だけしかしてはいけないのでしょうか?
通常、ヘッダファイルでは変数の定義は行いません。複数のファイルからインクルードされた場合に重複定義のエラーとなるからです。そのため、ヘッダファイル内では宣言のみを行います。しかし、これだけだと変数の定義がありません。そのため、どこかで定義を記述する必要があります。
>または解説ページなどがあれば紹介だけでもお願いします
適当なページが思いつかないのですが、1つだけ挙げておきます。
参考URL:http://www.catnet.ne.jp/kouno/c_faq/c1.html#7
No.1
- 回答日時:
myheader.h内で変数を定義したのでは、main.cppとsub.cppの両方で変数が定義されることになります。
ヘッダファイル内では宣言のみにしてください。具体的には、myheader.h内では「extern int i;」のように宣言し、main.cppかsub.cppのどちらか一方で「int i;」と定義してください。これでエラーがでなくなるはずです。#ただし、ループカウンタをグローバル変数にするのはどうかと思いますが...。
gimmickさん、ありがとうございます
無事コンパイルが通りました^^
しかし・・・ヘッダーファイルでは宣言だけしかしてはいけないのでしょうか?
それとプログラムファイルの中でもう一度定義しなおすのはなぜなんでしょうか?
たぶんこれもC言語では基礎的なものだとは思うのですがそちらも教えてもらえないでしょうか?
または解説ページなどがあれば紹介だけでもお願いします
今から自分でも調べてみるつもりです
>#ただし、ループカウンタをグローバル変数にするのはどうかと思いますが...。
あ、これは例えであって実際にはしてません(^-^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
グローバル変数のよくない使い...
-
ファイル名の先頭にアンダース...
-
WAVファイル同士の結合が可...
-
急にプログラムが正しく動かな...
-
Perlでファイルを読み込む場合...
-
jwsファイルが開けない!
-
unlinkしたファイルを元に戻す...
-
Cでのネットワークファイルの読...
-
fopenできる上限の変更
-
Dreamweaverコードカラーについて
-
FileOpen 関数で既にファイル...
-
javaで例外エラーが発生した際...
-
mmap()を使ったファイルへの書...
-
複数ファイルによる共通の外部...
-
csvファイルを開かずに文字を検...
-
写真の撮影日を取得するには?
-
CSVファイル読み込み
-
分割コンパイルの#defineについて
-
インプットファイル・アウトプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
SGファイルって何ですか?
-
テキストファイルの最終行を削...
-
Excelマクロでの再読込み方法
-
分割コンパイルの#defineについて
-
大きいサイズのテキストファイ...
-
グローバル変数のよくない使い...
-
ドラッグアンドドロップでファ...
-
VBAにてEXCEL以外のファイル(テ...
-
C言語のfopenについて教えてく...
-
iniファイルに追記がしたいです。
-
バッチで118項目のCSVを処理し...
-
【C#】リソースファイルの埋め...
-
FileOpen 関数で既にファイル...
-
VBに、Cのincludeのようなもの...
-
WAVファイル同士の結合が可...
-
ハッシュの計算時間について
おすすめ情報