您不需要那种用于字符串文字的解决方案,因为它们是在语言级别上串联的,而且因为“ s”“ 1”不是有效的预处理器标记,因此无论如何都不会起作用。
[编辑:针对不幸的是,下面的错误“ Just for the record”评论遭到了多次投票,我将重申上面的声明,并观察程序片段
#define PPCAT_NX(A, B) A ## B
PPCAT_NX("s", "1")
从gcc的预处理阶段生成此错误消息:错误:粘贴“” s“”和“” 1“”没有给出有效的预处理令牌
]
但是,对于常规令牌粘贴,请尝试以下操作:
/*
* Concatenate preprocessor tokens A and B without expanding macro definitions
* (however, if invoked from a macro, macro arguments are expanded).
*/
#define PPCAT_NX(A, B) A ## B
/*
* Concatenate preprocessor tokens A and B after macro-expanding them.
*/
#define PPCAT(A, B) PPCAT_NX(A, B)
然后,例如PPCAT_NX(s, 1)
和PPCAT(s, 1)
产生标识符s1
,除非s
被定义为宏,在这种情况下PPCAT(s, 1)
产生<macro value of s>1
。
继续主题的是这些宏:
/*
* Turn A into a string literal without expanding macro definitions
* (however, if invoked from a macro, macro arguments are expanded).
*/
#define STRINGIZE_NX(A) #A
/*
* Turn A into a string literal after macro-expanding it.
*/
#define STRINGIZE(A) STRINGIZE_NX(A)
然后,
#define T1 s
#define T2 1
STRINGIZE(PPCAT(T1, T2)) // produces "s1"
相比之下,
STRINGIZE(PPCAT_NX(T1, T2)) // produces "T1T2"
STRINGIZE_NX(PPCAT_NX(T1, T2)) // produces "PPCAT_NX(T1, T2)"
#define T1T2 visit the zoo
STRINGIZE(PPCAT_NX(T1, T2)) // produces "visit the zoo"
STRINGIZE_NX(PPCAT(T1, T2)) // produces "PPCAT(T1, T2)"