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