#define
dマクロは、通常のCスコープ規則に従わないという点でグローバルです。マクロからのテキスト置換は、マクロ名がその後に表示される場所#define
に(ほぼ)適用されます。(注目すべき例外は、マクロ名がコメントの一部または文字列リテラルの一部である場合です。)
ヘッダーファイルでマクロを定義すると、ファイルが後で明示的に定義を解除しない限り、そのヘッダーファイルであるすべて#include
のファイルがそのマクロを継承します(必要かどうかは関係ありません)#undef
。
あなたの例では、マクロfile2.c
について知りません。からTEST
ピックアップすることをどのように知るのでしょうか?魔法で?マクロはソースコードに対してテキスト置換を実行するため、生成されたオブジェクトファイルにはマクロの表現はありません。したがって、その置換ルール自体を知る必要があります。複数のファイル間でそれを共有する場合は、ファイルと共通のヘッダーファイルに存在する必要があります。#define
file1.c
file2.c
#define
.c
#include
ライブラリに表示されるのがいくつ機能するかを具体的に尋ねる場合、それらの多くは、コンパイル環境によって提供される事前定義され#ifdef
たマクロ名と照合している可能性があります。たとえば、C99コンパイラは、言語バージョンを指定するマクロを定義します。Microsoftコンパイラはマクロを定義します。(これらの定義済みマクロは、コンパイラー用に予約されているため、多くの場合、先頭の下線で始まります。)__STDC_VERSION__
_MSC_VER
さらに、ほとんどのコンパイラでは、コマンドライン引数として単純なマクロを定義できます。たとえば、を無効にするように定義された状態でgcc -DNDEBUG file1.c
コンパイルするために、を介してコードをコンパイルできます。file.c
NDEBUG
assert