#define
dマクロは、通常のCスコープ規則に従わないという点でグローバルです。マクロからのテキスト置換が(ほぼ)に適用されます#define
の後にマクロ名が表示されます。
ヘッダーファイルにマクロを定義した場合、そのヘッダーファイルを持つファイルはすべて、そのマクロを継承します(これらのマクロは、マクロを継承するかどうかは関係ありません。それが明白にそれを#undef
で定義解除しない限り)。
例では、file2.c
はTEST
マクロについてはわかりません。 file1.c
から#define
を受け取る方法をどのように知っていますか?魔法で?マクロはソースコード上でテキスト置換を実行するため、生成されたオブジェクトファイルにはマクロの表現がありません。したがって、#define
は、共通のヘッダーファイル(.c
ファイル#include
)に存在する必要があります。file2.c
は、その置換ルール自体を知る必要があります。
あなたは、それらの多くは、おそらくコンパイル環境によって提供さ事前に定義されたマクロ名に対してチェックされているどのように多くのあなたが仕事のライブラリに表示さ#ifdef
秒程度、特に求めている場合。たとえば、C99コンパイラは言語バージョンを指定する__STDC_VERSION__
マクロを定義します。 Microsoftコンパイラは_MSC_VER
マクロを定義します。ほとんどのコンパイラでは、単純なマクロをコマンドライン引数として定義することもできます。たとえば、コードgcc -DNDEBUG file1.c
を使用してコードをコンパイルして、を無効にしてNDEBUG
を定義してfile.c
をコンパイルします。
どこに定義されているかによって異なります。 – Nick
'#define'はプリプロセッサディレクティブです。コンパイル時に単純なテキスト置換を行います。コンパイル単位と' #include'ファイルは '#define'を参照します。 –