C预处理器宏参数替换规则疑问:两次宏调用为何输出不同?
C预处理器宏展开差异问题解析
情况1:直接调用f1宏
#define mytype __mytype #define f1(in)\ call##in f1(mytype)
执行gcc -E file.c后输出:callmytype
情况2:通过f2间接调用f1宏
#define mytype __mytype #define f1(in)\ call##in #define f2(in)\ f1(in) f2(mytype)
输出为:call__mytype
问题解答
你的理解不完全准确,核心原因是预处理器的宏展开规则中,##连接符会抑制其参数的宏替换,而间接调用时参数会先完成替换再传入。
具体拆解:
- 直接调用
f1(mytype)时,##属于预处理运算符,它会阻止参数mytype被展开成__mytype,直接将call和mytype拼接,得到callmytype。 - 间接调用
f2(mytype)时,f2的参数mytype没有被##抑制,会先展开为__mytype,再将展开后的结果传入f1,此时f1将call和__mytype拼接,得到call__mytype。
简言之:宏参数在遇到##或#(字符串化运算符)时,不会先展开;但如果通过外层宏传递,外层宏无这类运算符,参数会先展开再传递给内层宏。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

