据我了解,我了解到#
运算符与参数宏一起使用,可将其参数转换为字符串,而##
用于将两个参数或带有其他标识符的参数连接起来(如果我的理解是错误的,请纠正我。)
但是如何同时使用#
和##
运算符?我尝试这样做:
#define str(n) #n ## #n
我以为是
printf("%s",str(Hello))
将扩展为
printf("%s", "Hello""Hello")
由于相邻的字符串会自动连接在一起,从而在C中形成一个字符串,因此,这将导致printf("%s", "HelloHello")
,输出将为HelloHello
。但是故事不同,它引发了一个错误:
粘贴“ hello”和“ hello”没有给出有效的预处理令牌
请向我解释如何使用#
和##
运算符扩展这些参数宏。
答案 0 :(得分:3)
##
“连接两个参数”是一个极大的简化。该运算符加入令牌。并且结果必须是单个 valid 令牌。不能将两个字符串文字记号标记粘贴到单个记号中。
此外,字符串文字串联在以后的翻译阶段处理。因此,对您的宏的一个明显的解决方法是根本不使用##
。
#define str(n) #n #n
但是,如果您确实要同时使用两者,则需要在字符串化之前先标记 。并通过中间宏扩展来做到这一点。
#define str(n) str_(n ## n)
#define str_(nn) #nn