2

コードを書いているときに面白いことを発見しました。コードでマクロを定義しましたが、そのキーワードintをそのマクロのパラメーターの変数名として誤って使用してしまいました。コードは完全に正常に機能しましたが、少し驚いています。C のキーワードは予約語であり、変数名として使用できないことを読みました。

これは私のコードです:

#include <stdio.h>

#define PRINT(int) printf("%d",int)

int main()
{
    int x=2;
    PRINT(x);
    return 0;
} 

なぜそれがうまく機能しているのか、誰かが私に説明できますか? キーワードが予約されており、C で変数名として使用できないというのは本当ではないですか、それともこれは C のマクロの例外ですか?

4

4 に答える 4

6

このコンテキストでintは、 は変数 (より正確にはparameter ) 名ではありません。もちろんPRINT、関数でもありません。これはプリプロセッサ マクロです。

マクロ定義の一部として記述した内容は、プリプロセッサによってのみ参照されます。コンパイラが処理されたソースを確認するまでには、"int"名前は何も残っていません。

これは、関数の仮パラメーターで起こることと似ています: コンパイラーはそれらの名前を認識しますが、ソースを処理した後はコンパイル済みコードにそれらの痕跡は残りません (そのため、デバッガーでデバッグ シンボルを読み込んで「取得する必要があります」この情報は戻ってきます」)。

于 2012-04-06T11:38:42.880 に答える
4

#define、C コンパイラが認識する前に、プリプロセッサによって置き換えられます。コンパイラ自体が見ているのは次のとおりです。

int main()
{
int x=2;
printf("%s",x);
return 0;
}

これは有効な C コードです。キーワードを変数名として使用すると、エラーが発生します。

int main()
{
int float=2;
printf("%s",float);
return 0;
}

これはコンパイルされません。

于 2012-04-06T11:38:57.103 に答える
3

前処理段階では、キーワードは存在せず、通常の識別子と見なされます。

于 2012-04-06T11:38:52.063 に答える