確認のため.
インクルードガードとは
C, C++において同じヘッダファイルを何度もインクルードしないようにするための処置.
コンパイルを高速にする、includeディレクティブによる二つのファイルの相互インクルードを防止する目的がある.
ifndef
, define
プリプロセッサディレクティブを用いて以下のような条件付きコンパイルの分岐を記述する
#ifndef XXXXX // XXXXX が定義されていなかったら #define XXXXX // XXXXXを定義 ... #endif
ことで XXXXX
が定義されていない一回目のインクルードだけが実行される.
何度もインクルードしない方法としてはインクルードガードを記述するか, プリコンパイル済みヘッダとして別に定義しておくことが考えられる.
内部インクルードガードの書き方
コンパイルエラーを防止するために二重のインクルードを防止するインクルードガードを内部インクルードガードと呼ぶ.
UUIDを付与して記述
乱数に基づくUUID(UUID version 4)の場合、およそ5.3×1036通り( $2^{122}=5316911983139663491615228241121378304}2^ {{122}=5316911983139663491615228241121378304$)存在し、正しく生成されていれば、...、2つのIDが偶然一致するまでには期待値で261個のIDの生成が必要...。 出典:UUID - Wikipedia
二つのインクルードガードに用いたUUIDがたまたま同じになる可能性は0と考えていいため、とりあえずUUIDをつけておけば「たまたまインクルードガードのマクロ名が同じだった」等の理由でインクルードされる事象は発生しなくなると考えられる.
例えば以下の様になる.
#ifndef FILENAME_B41B055C_1D84_11EA_978F_2E728CE88125 #define FILENAME_B41B055C_1D84_11EA_978F_2E728CE88125 ... #endif
pragma once
#pragma once
を記述する. 古いコンパイラを使用する場合は避ける.
冗長インクルードガード
インクルード先のファイルにも ifdef~
で記述を指定する. 記述することでコンパイルの高速化をする.
マクロ名の定義がインクルード先になるため, 複数ファイル間に結合が生じてしまう(=異なるファイルに同じマクロ名が存在することをあらかじめ知っておかないと修正し忘れる恐れがある)ので注意すること.
プリコンパイル済みヘッダ
以下を参照.
https://www.isus.jp/products/c-compilers/stdafxh/