我试图使代码段可重用。我在下面的评论片段并没有按照我的意愿行事:
replace(@arr)
我希望#define NAME ABC
#define LOG_SIZE NAME##_LEN
解析为LOG_SIZE
。我已经尝试过使用#,但是还没有能够让它发挥作用。代码中使用了ABC_LEN
,因此我不想将宏更改为:
LOG_SIZE
有办法做到这一点吗?
答案 0 :(得分:3)
问题在于,如果宏参数被字符串化或连接到另一个标记,则它们不会自动展开。
C99 6.10.3.1/1:
在识别出类似函数的宏的调用参数之后,发生参数替换。替换列表中的参数除非前面带有#或##预处理标记或后跟##预处理标记(见下文),否则在扩展其中包含的所有宏之后,相应的参数将替换该参数。在被替换之前,每个参数的预处理标记都被完全宏替换,好像它们形成了预处理文件的其余部分;没有其他预处理令牌可供使用。
您可以通过在传递NAME
的宏和将其与_LEN
连接的宏之间添加另一个宏来解决此问题。
#define NAME ABC
#define AFTERX(x) x##_LEN
#define XAFTERX(x) AFTERX(x)
#define LOG_SIZE XAFTERX(NAME)
LOG_SIZE
//evaluates to ABC_LEN
如果您有兴趣,可以在Section 3.10.6: Argument Prescan
中详细了解gcc手册