3

same2、same1を置き換え、連結するフローを理解しようとしています。

#include<stdio.h>
#define concatenate(a,b) a##b
#define same1(a)  #a
#define same2(a)  same1(a)
main()
{
        printf("%s\n",same2(concatenate(1,2)));
        printf("%s\n",same1(concatenate(1,2)));
}

私はこれを多くの場所から理解しようとしましたが、理解できません。誰かがそれをもっと明確に説明できますか?

4

2 に答える 2

3

#define concatenate(a,b) a##b
#define same1(a)  #a
#define same2(a)  same1(a)

を持っている場合same2(concatenate(1,2))、の引数はsame2に渡される前に展開されるsame1ため、そこでconcatenate(1,2)はその結果に置き換えられ、12次にによって文字列化さsame1れて。が生成され"12"ます。

を使用same1すると、マクロ引数の前に文字列化トークンが続くため、マクロ引数の展開は発生しません#

関数のようなマクロを呼び出すための引数が識別された後、引数の置換が行われます。置換リストのパラメーターは、前に#または##前処理トークンが続くか、前処理トークンが後に続く場合を除き##(以下を参照)、そこに含まれるすべてのマクロが展開された後、対応する引数に置き換えられます。置換される前に、各引数の前処理トークンは、前処理ファイルの残りの部分を形成しているかのように完全にマクロ置換されます。他の前処理トークンは利用できません。

(n1570のセクション6.10.3.1(1))

于 2012-10-08T18:21:35.063 に答える
0

1と2がパラメータとして渡されたときにあなたconcatinate(a,b)はなります。concatinate(1,2)これは、連結演算子であるため、1##2に変換されます。したがって、パラメーター1と2は連結されて12になります。12##

Same1(a)は単純#aになります。ここで、#はstringisizing演算子です(http://c-faq.com/ansi/stringize.htmlを参照)。したがって、Same1(12)コンソール"12"に印刷すると、

Same2(a)はと同じですSame1(a)。これは単純#aに、パラメータをそのまま出力するだけです。したがって、パラメータaが「Concatenate(1,2)」である場合の出力はSame2(a)、単なる文字列「Concatenate(1,2)」です。

于 2012-10-08T17:19:46.900 に答える