C / C ++macrosstring连接

#define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2 

是否可以连接STR3 ==“s1”? 您可以通过将parameter passing给另一个macros函数来完成此操作。 但有没有直接的方法?

如果他们都是string,你可以做:

 #define STR3 STR1 STR2 

预处理器自动连接相邻的string。

编辑:

如下所述,它不是预处理器,而是编译器进行连接。

你不需要这样的string文字解决scheme,因为它们是在语言层次上连接的,而且它不会工作,因为“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(s, 1)产生标识符s1

继续这个主题是这些macros:

 /* * 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" 

提示:上面的STRINGIZEmacros很酷,但是如果你犯了一个错误,它的参数不是一个macros – 你的名字中有一个拼写错误,或者忘了#include头文件 – 那么编译器会高兴地把声明的macros名称input到没有错误的string中。

如果你打算STRINGIZE的参数总是一个具有正常C值的macros,那么

 #define STRINGIZE(A) ((A),STRINGIZE_NX(A)) 

将展开一次并检查它的有效性,丢弃它,然后再次展开成一个string。

我花了一段时间才弄清楚为什么STRINGIZE(ENOENT)结束为"ENOENT"而不是"2" …我没有包含errno.h