めも

メモ.

インクルードガードの書き方

確認のため.

インクルードガードとは

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~で記述を指定する. 記述することでコンパイルの高速化をする.

マクロ名の定義がインクルード先になるため, 複数ファイル間に結合が生じてしまう(=異なるファイルに同じマクロ名が存在することをあらかじめ知っておかないと修正し忘れる恐れがある)ので注意すること.

プリコンパイル済みヘッダ

以下を参照.

プリコンパイル済みヘッダ | C言語入門~bituse~

https://www.isus.jp/products/c-compilers/stdafxh/

参考文献

プリコンパイル済みヘッダー ファイル | Microsoft Docs

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。