14

私は以下のCプログラムを持っています:

#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}

プリプロセッサだけを実行すると、これが次のように展開されます

{
int var12=100;
printf("%d",var12);
}

これが、出力が 100 になる理由です。

プリプロセッサが拡張する方法/理由を誰か教えてもらえますかvar##12 to var12?

4

4 に答える 4

31

あまりにも派手なことは何もありません:##プリプロセッサに左側と右側を連結するように指示します

http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenationを参照してください

于 2010-01-08T06:19:17.517 に答える
6

## は c プリプロセッサのトークン連結演算子であるためです。

あるいは質問の意味が分からないのかもしれません。

于 2010-01-08T06:19:31.603 に答える
5

##is Token Pasteing Operator

「マージ」演算子と呼ばれることもある二重番号記号または「トークン貼り付け」演算子 (##) は、オブジェクトのようなマクロと関数のようなマクロの両方で使用されます。個別のトークンを 1 つのトークンに結合できるため、マクロ定義の最初または最後のトークンにすることはできません。

マクロ定義の仮パラメータの前または後にトークン貼り付け演算子がある場合、仮パラメータは展開されていない実引数にすぐに置き換えられます。マクロ展開は、置換前の引数に対して実行されません。

于 2010-01-08T06:21:41.063 に答える
2

#define f(g,g2) g##g2

## は、c プリプロセッサで 2 つのマクロを連結するために使用されます。したがって、コンパイルする前に f(var,12) はプリプロセッサによって var12 に置き換えられるため、出力が得られます。

于 2010-01-08T09:23:37.377 に答える