ひとつのコンパイル単位で同じヘッダファイルを2度 #include しないようにするためには、プリプロセッサを使います。
そもそも、なぜコンパイル単位で同じヘッダを2度 #include してはならないのかというと、無限 #include に陥ってしまったり、シンボルが重複してしまうからです。たとえば this.h というヘッダファイルの中で #include “this.h” と書いてしまうと this.h が this.h を #include して、さらに #include された this.h が this.h を #include しで…となってしまい、コンパイルがいつまで経っても終わらなくなります。シンボルの重複とは話が簡単です。要は同じ名前は2回使えませんということです。たとえば構造体や関数や変数の名前は決められた範囲の中で一意である必要があるのです。
なにやら訳がわかりませんが、幸いなことに対処方法は非常に簡単です。ヘッダファイルに定型句を書くだけです。
#ifndef THIS_HEADER_INCLUDED__ #define THIS_HEADER_INCLUDED__ /* ここにヘッダファイルの中身を書く */ #endif
THIS_HEADER_INCLUDED__ はヘッダファイルごとに違う文字列を入れてください。好きな名前をつけていただいて問題ありませんが、他のファイルと重複しないようにする必要があります。ファイル名から考えるのが楽かと思います。こう書いておくとたとえば次のようなコードを書いても問題なくコンパイルが通るようになります。
// わざと何回も #include してみる #include "this.h" #include "this.h" #include "this.h" #include "this.h" #include "this.h" // 問題なし
ここまで極端なソースにはならないと思いますが、同じような意味のことは十分起こりえます。ヘッダファイルを書く場合は #ifndef #define #endif のセットで覚えておきましょう。
Comments
懐かしい方法です。
専門学校時代に現役ゲームプログラマー講師に教わった方法ですが僕は使っていません(爆)
ちなみに僕は「#pragma once」で多重定義防止しています。
ヘッダファイルの一番最初にこの一行を差し込むだけで多重定義防止が可能となります。
でも、やり方は人それぞれですし、「#ifndef #define #endif」を覚える上では上記の方法も捨てがたいですね。
「#pragma once」は応用がききませんが「#ifndef #define #endif」は応用できますからね。
失礼しました~
>たつにいさん
#pragma one の方が可読性は高いと思いますよ。
ただ、 #ifndef #define #endif はすでにイディオムとなってしまっているので、
なかなか牙城を崩すのが難しいです。
誰かカリスマプログラマが「やめよう!」って言ってくれれば良いかもです。
Contributions