• 締切済み

ヘッダーの多重定義での疑問です。

 Cで開発をしているのですが、ヘッダーファイルでの定義ではたとえば、int a と か double hoge とか定義して、そのヘッダーファイルを複数の cファイルが読み込むと多重定義になりますよね? hoge.h int a; // 多重定義 このヘッダーを複数の.cファイルに読み込む しかし、自分のプロジェクトだと、ヘッダーファイルにint aとかdouble hogeとか 定義してもエラーにならないんです。 ただし、int b = 10;のように代入すると多重エラー また、試しに新しくプロジェクトを作ってヘッダーで定義すると多重定義でエラーでした。

みんなの回答

回答No.2

>でもこのプロジェクトだけエラーがないです。 もしかして、ヘッダーがコンパイルされている? 私の方プリコンパイルヘッダーはあまり好きじゃないので、 常時OFFなんですが、確かVCってデフォルトでONだったような。 ONの時、ヘッダーはヘッダーだけでコンパイルされて、 何回includeしても、1回だけになることが、以前あったような。 (ずっとOFFにしてるので、記憶曖昧ですいません) 大規模なプロジェクトだと、ヘッダーがヘッダーを条件で ロードしているので、コンパイル時間が遅くなるという判断の為に、 最初にヘッダーだけヘッダーが有効になるエリアだけを 事前に作ってしまう機能があり、これが邪魔でこちらOFFだったのですが。 確信はないのですが、設定のプリコンパイルヘッダーの使用を いじってみると、エラーが出せるかもしれません。 しばらくC言語自体触ってないので、猛烈に見当違いの可能性もあり、 その時はスルーお願いします。

DEADSPACE566
質問者

お礼

返信ありがとうございます。 まさかここまで重要な意見がもらえるとは思えませんでした。 プリコンパイルヘッダーの設定が影響してるんですね。 ヘッダーがコンパイルされるということもあるんですね。 そこのところは勉強不足で分かりませんでした。 何回includeしても一回だけになるという機能を覚えておくようにします。 >大規模なプロジェクトだと、ヘッダーがヘッダーを条件で ロードしているので、コンパイル時間が遅くなるという判断 う~ん、そういった事が可能なんですね・・・ 眼からうろこ、自分も精進しようと思います。 自分はCは結構勉強している自負があったんですが、まだまだ広いんですね。 

回答No.1

そもそも、ヘッダーに、 実体を作ってるのが間違いなのでは? extern 指定にするべきでは?

DEADSPACE566
質問者

お礼

自分もそうしないといけないと思います。 そうしないと二重定義になるというのが自分の解釈です。 でもこのプロジェクトだけエラーがないです。 プロジェクトごとに結果が違うってことはVisualStudioのバグなんでしょうか?

関連するQ&A