C++ では、#define
プリプロセッサ ディレクティブを使用して、コンパイラがコンパイル前に置き換える記号定数を定義できます。私の質問は、コンパイラは通常、これらをどのように内部に格納し、データ型を持っているのですか?
1 に答える
6
厳密に言えば、コンパイラ#define
は、プリプロセッサ ディレクティブで宣言された定数を認識しません。これらは、プリプロセッサによってテキスト置換ベースで処理されます。プリプロセッサは C++ 言語のセマンティクスについて何も知らないため、C++ の意味での「型」はありません。
プリプロセッサは、単純なテキスト置換戦略を使用してマクロを解決します。たとえば、次のコードでは:
#define FIVE 5
int a = FIVE;
コンパイラーは以下のみを認識します。
int a = 5;
シンボルFIVE
は、コンパイラが参照するソースから削除されています。コンパイラには、プリプロセッサのみを実行するオプションがあります。GCC では-E
、MSVC では/E
or/P
です。このようなオプションを使用すると、プリプロセッサを介してソースを実行して、ソースがどのように変更されたかを確認できます。
于 2009-10-10T23:08:52.010 に答える