- 締切済み
ヘッダーの多重定義での疑問です。
Cで開発をしているのですが、ヘッダーファイルでの定義ではたとえば、int a と か double hoge とか定義して、そのヘッダーファイルを複数の cファイルが読み込むと多重定義になりますよね? hoge.h int a; // 多重定義 このヘッダーを複数の.cファイルに読み込む しかし、自分のプロジェクトだと、ヘッダーファイルにint aとかdouble hogeとか 定義してもエラーにならないんです。 ただし、int b = 10;のように代入すると多重エラー また、試しに新しくプロジェクトを作ってヘッダーで定義すると多重定義でエラーでした。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>でもこのプロジェクトだけエラーがないです。 もしかして、ヘッダーがコンパイルされている? 私の方プリコンパイルヘッダーはあまり好きじゃないので、 常時OFFなんですが、確かVCってデフォルトでONだったような。 ONの時、ヘッダーはヘッダーだけでコンパイルされて、 何回includeしても、1回だけになることが、以前あったような。 (ずっとOFFにしてるので、記憶曖昧ですいません) 大規模なプロジェクトだと、ヘッダーがヘッダーを条件で ロードしているので、コンパイル時間が遅くなるという判断の為に、 最初にヘッダーだけヘッダーが有効になるエリアだけを 事前に作ってしまう機能があり、これが邪魔でこちらOFFだったのですが。 確信はないのですが、設定のプリコンパイルヘッダーの使用を いじってみると、エラーが出せるかもしれません。 しばらくC言語自体触ってないので、猛烈に見当違いの可能性もあり、 その時はスルーお願いします。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
そもそも、ヘッダーに、 実体を作ってるのが間違いなのでは? extern 指定にするべきでは?
お礼
自分もそうしないといけないと思います。 そうしないと二重定義になるというのが自分の解釈です。 でもこのプロジェクトだけエラーがないです。 プロジェクトごとに結果が違うってことはVisualStudioのバグなんでしょうか?
お礼
返信ありがとうございます。 まさかここまで重要な意見がもらえるとは思えませんでした。 プリコンパイルヘッダーの設定が影響してるんですね。 ヘッダーがコンパイルされるということもあるんですね。 そこのところは勉強不足で分かりませんでした。 何回includeしても一回だけになるという機能を覚えておくようにします。 >大規模なプロジェクトだと、ヘッダーがヘッダーを条件で ロードしているので、コンパイル時間が遅くなるという判断 う~ん、そういった事が可能なんですね・・・ 眼からうろこ、自分も精進しようと思います。 自分はCは結構勉強している自負があったんですが、まだまだ広いんですね。