1

C++ では、#defineプリプロセッサ ディレクティブを使用して、コンパイラがコンパイル前に置き換える記号定数を定義できます。私の質問は、コンパイラは通常、これらをどのように内部に格納し、データ型を持っているのですか?

4

1 に答える 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 に答える