インクルードガード
C/C++では、インクルード方式を採用しているが、インクルード方式は多重にインクルードされることがあり、それを防ぐ方法が必要となる。
code:include_guard.c
#ifndef FOO_H_ // インクルードガード
#define FOO_H_ // インクルードガード
// 多重インクルード
#include "bar.h"
int foo_func(int x, bar_t b);
#endif /* FOO_H_ */ // インクルードガード
しかし、この方法でも毎回パースすることは避けられない。
このため、プリプロセッサの #pragma ディレクティブで、onceと書くことで、1度のみ読み込む事を宣言できるようになった。(ただし、非標準)
#pragma ディレクティブを解釈しない環境のために、インクルードガードはまだ消すことができない。
code:pragma_once.c
#ifndef FOO_H_ // インクルードガード
#define FOO_H_ // インクルードガード
// pragma once を解釈しない環境のために、ifdef で括るのが望ましい。
#pragma once
#ifndef BAR_H_ // 多重インクルードガード(既知のものに限る)
// 多重インクルード
#include "bar.h"
#endif /* BAR_H_ */
int foo_func(int x, bar_t b);
#endif /* FOO_H_ */ // インクルードガード
定型句なので、自動化によるソース生成ができるならば特殊なシンボルで代用することが考えられる。
code:include_guard_pre.c
%INCLUDE_GUARD_PRE%
%INCLUDE "bar.h"%
int foo_func(int x, bar_t b);
%INCLUDE_GUARD_POST%
関連
インクルード
参考
https://en.wikipedia.org/wiki/Pragma_once