私は以下の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
?
私は以下の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
?
あまりにも派手なことは何もありません:##
プリプロセッサに左側と右側を連結するように指示します
http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenationを参照してください
## は c プリプロセッサのトークン連結演算子であるためです。
あるいは質問の意味が分からないのかもしれません。
「マージ」演算子と呼ばれることもある二重番号記号または「トークン貼り付け」演算子 (##) は、オブジェクトのようなマクロと関数のようなマクロの両方で使用されます。個別のトークンを 1 つのトークンに結合できるため、マクロ定義の最初または最後のトークンにすることはできません。
マクロ定義の仮パラメータの前または後にトークン貼り付け演算子がある場合、仮パラメータは展開されていない実引数にすぐに置き換えられます。マクロ展開は、置換前の引数に対して実行されません。
#define f(g,g2) g##g2
## は、c プリプロセッサで 2 つのマクロを連結するために使用されます。したがって、コンパイルする前に f(var,12) はプリプロセッサによって var12 に置き換えられるため、出力が得られます。