#defineの有効範囲は何ですか?#defineのスコープは何ですか?
C/C++の#defineの範囲に関する質問があり、プリプロセッサを理解しようとしています。
たとえば、複数のソースファイルとヘッダーファイルを含むプロジェクトがあるとします。のは、私は次のように持っているヘッダファイルを持っているとしましょう:
// header_file.h
#ifndef __HEADER_FILE
#define __HEADER_FILE
#define CONSTANT_1 1
#define CONSTANT_2 2
#endif
だが、私は次の順序でコンパイルされている2つのソースファイルを持っているとしましょう:
// source1.c
#include header_file.h
void funct1(void)
{
int var = CONSTANT_1;
}
// source2.c
#include header_file.h
void funct2(void)
{
int var = CONSTANT_2;
}
私が必要な他のすべてが含まれていると仮定すると、オーバーヘッド、このコードは正常にコンパイルする必要があります。しかし、コンパイルの間に#defineが記憶されているかどうか不思議です。上記のコードをコンパイルすると、各#includeの内容は実際にインクルードされていますか、インクルードガードが実際に実装されていますか?
TLDR:1つのコンパイル単位から次のコンパイル単位まで#defineが引き継がれますか?または、#defineは1つのコンパイル単位内にのみ存在しますか?
これを入力すると、私は自分自身の質問に答えていると信じています。私は信じられた答えを述べます。 #defineは単一のコンパイル単位(.c)に制限されています。プリプロセッサは、あるコンパイル単位から次のコンパイル単位に進むときに#defineを本質的に忘れる。したがって、私が挙げた上記の例では、インクルードガードは機能しません。私はこの信念で正しいですか?
TL/DR: '#define'は各コンパイル単位で、'#undef'-edまで下向きに定義されている点から見ることができます。 –
[Cでの#defineプリプロセッサのスコープ](http://stackoverflow.com/questions/6379489/scope-of-define-preprocessor-in-c)の可能な複製 –