一起使用'#'和'##'预处理运算符

时间:2019-01-26 08:54:06

标签: c c-preprocessor preprocessor-directive

据我了解,我了解到#运算符与参数宏一起使用,可将其参数转换为字符串,而##用于将两个参数或带有其他标识符的参数连接起来(如果我的理解是错误的,请纠正我。)

但是如何同时使用###运算符?我尝试这样做:

#define str(n)  #n ## #n

我以为是

printf("%s",str(Hello))

将扩展为

printf("%s", "Hello""Hello")

由于相邻的字符串会自动连接在一起,从而在C中形成一个字符串,因此,这将导致printf("%s", "HelloHello"),输出将为HelloHello。但是故事不同,它引发了一个错误:

  

粘贴“ hello”和“ hello”没有给出有效的预处理令牌

请向我解释如何使用###运算符扩展这些参数宏。

1 个答案:

答案 0 :(得分:3)

##“连接两个参数”是一个极大的简化。该运算符加入令牌。并且结果必须是单个 valid 令牌。不能将两个字符串文字记号标记粘贴到单个记号中。

此外,字符串文字串联在以后的翻译阶段处理。因此,对您的宏的一个明显的解决方法是根本不使用##

#define str(n) #n #n

但是,如果您确实要同时使用两者,则需要在字符串化之前先标记 。并通过中间宏扩展来做到这一点。

#define str(n) str_(n ## n)
#define str_(nn) #nn