C言語におけるマクロのネスト運用

994 ワード

寮のある同級生はlinuxグループの納新に参加して、暇な時に彼らの納新問題を見て、その中にC言語の下でマクロのネストの運用の特例に関連して、自分は接触したことがなくて、資料を調べて、それを記録しました.
具体的なテーマは、次のコードを説明します.
#include <stdio.h>

#define f(a,b) a##b
#define g(a) #a
#define d(a) g(a)

int main()
{
    printf("%s
",d(f(a,b))); printf("%s
",g(f(a,b))); return 0; }

このコードの出力は次のとおりです.
ab
f(a,b)
まずdefineの##と##の役割を説明します.
#は、#後のパラメータを文字列に変更します.たとえば、上のコードの#aが「a」です.
##は、前のコードのa##bがabであるなど、前後の2つのパラメータを接続します.
一般的なネスト順では、内部パラメータを展開してから外層関数を展開しますが、この方法は現在の特殊な状況には適用されません.通常の方法で展開すると、2行の出力はabになるはずです.
では、なぜ上図の出力が現れるのでしょうか.
これがネスト中の特例です.
資料を調べたところ、次のことがわかりました.
1.マクロに#演算子がある場合、パラメータは展開されません.
2、マクロに##演算子がある場合は、関数を展開してから、中のパラメータを展開します.
これにより、上のコードを分析します.
1回目の出力時、d(f(a,b))のd()には#と##演算子がないので、一般的な法則で展開すればよいので、#abが得られ、最終的にabが文字列として出力される.
2回目の出力の場合、g(f(a,b))のg()には#演算子が含まれているので、規定によりパラメータが展開されなくなり、これにより#f(a,b)が得られ、最終的にf(a,b)が文字列として出力される.
以上がすべてです.