#ifndef ~ #endif とは

ヘッダファイルに#ifndefと#endifというものが登場してきたので、何者なのか整理しておく

#ifndef ~ #endif とは

  • プリプロセッサ命令の1つで、「条件コンパイル」という機能にあたるもの
  • 主に、重複定義回避のためにヘッダファイルで使用される

条件コンパイル とは

  • プログラムの中で不要な部分をカットする

  • カットしたい部分をコメントアウトすることでも対応できるが、

    不要な部分が何十行にも渡る場合は、条件コンパイルを使ったほうが便利

なぜ重複定義を回避しなければならないか

  • 1つのプログラムで、2回以上同じ宣言をしてはいけないため

ヘッダファイルでの条件コンパイル(#ifndef ~ #endif)

ヘッダファイルで条件コンパイルを使う理由

1つのプログラムで、あるcppファイルがHoge.hをインクルードし、

別のcppファイルが同じヘッダファイルをインクルードすると、同じ宣言を2回していることになってしまう

そこで、条件コンパイルを使用し、重複定義を回避する

使い方、意味

記号定数の定義とソースコードを挟む

#ifndef INCLUDE_Hoge_h_
#define INCLUDE_Hoge_h_

//処理

#endif

記号定数「INCLUDE_Hoge_h_」の名前は任意だが、ヘッダファイル名と同じにしておくとわかりやすい

「ifndef」とは、if(もし)、not(されていない)、def(define定義)というもので、

「もし、define定義がされていなければコンパイルする」という意味になる

プリプロセス~コンパイル時の動き

  1. プログラムで初めてHoge.hがインクルードされる
  2. まだINCLUDE_Hoge_h_が定義されていないので、#ifndefは無視され、処理部分がコンパイルされる

  また、#defineによりINCLUDE_Hoge_h_が定義される

  1. 2回目以降にHoge.hがインクルードされると、すでにINCLUDE_Hoge_h_が定義されているため

  #ifndefにより、#defineと処理部分はコンパイルされない

その他の条件コンパイル

ifndefと逆の動きをするifdefもある

詳しくは以下でわかりやすく説明されている

https://monozukuri-c.com/langc-ifdef/#toc10

参考

▼【C/C++】ヘッダーファイルの#ifndef ~ #endifの意味

https://www.kinjo-u.ac.jp/ushida/tekkotsu/cpp/ifndef.html

▼条件コンパイルによる重複定義の回避

https://www.kinjo-u.ac.jp/ushida/tekkotsu/cpp/ifndef.html