#ifndef


目次に戻る


三日連続で関数からかけ離れたけれど、まぁ気にしないでください。
 
#ifndef は #ifdef の逆です。つまり #ifndef MACRONAME 〜〜 #endif とあったら、 MACRONAME が #define されてない時にかぎり、〜〜の部分をコンパイルするという事です。
 
#ifdef を使えばそれでOKじゃん。と思うでしょうが、 #ifndef を使う定石が存在するの でそれを紹介します。それは、ヘッダファイルを書くときの手法で、以下のようにしてつか います。
/* myheader.h */
#ifndef __myheader_H__
#define __myheader_H__
    :
    :
    :
#endif
こうすると、myheader.h を何回 #include してもエラーになることはありません。そのため 、ヘッダファイルの管理が楽になるのです。
 
この定石を使用する場合の注意点としては、古い(5、6年以上前の)コンパイラは条 件コンパイルのネストを許可していないので、この手法が使えない場合があります。
/* 古いコンパイラではエラーになる例 */
#ifndef __global_H__
#define __global_H__

#ifdef MAIN
#define EXTERN
#else
#define EXTERN extern
#endif    /* ifdef MAIN */

EXTERN int gData;
    :
    :
#endif    /* ifdef __global_H__ */

こういう場合はしょうがないので次のような小手先殺法を使います。
/* 古いコンパイラで使う場合 */
#ifbdef __global_H__
#define __global_H__
    /* 構造体の宣言など */
    :
    :
#endif    /* ifdef __global_H__ */

#ifdef MAIN
#define EXTERN
#else
#define EXTERN extern
#endif    /* ifdef MAIN */

/* グローバル変数の宣言 */
EXTERN int gData;
    :
    :

#ifdef MAIN
#undef MAIN
#endif    /* ifdef MAIN */

ただし、一番良い解決策は新しいコンパイラを使用することです。


目次に戻る