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"
提示:上面的STRINGIZE
macros很酷,但是如果你犯了一个错误,它的参数不是一个macros – 你的名字中有一个拼写错误,或者忘了#include
头文件 – 那么编译器会高兴地把声明的macros名称input到没有错误的string中。
如果你打算STRINGIZE
的参数总是一个具有正常C值的macros,那么
#define STRINGIZE(A) ((A),STRINGIZE_NX(A))
将展开一次并检查它的有效性,丢弃它,然后再次展开成一个string。
我花了一段时间才弄清楚为什么STRINGIZE(ENOENT)
结束为"ENOENT"
而不是"2"
…我没有包含errno.h
。
- 为什么在macros中使用明显无意义的do-while和if-else语句?
- #ifdef和#if – 这是更好/更安全的方法来启用/禁用编译特定部分的代码?
- C ++预处理器:避免代码重复成员variables列表
- C预处理器是否与C预处理器相同?
- 在C ++ 11中应该先发生什么:原始string扩展或macros?
- ifdef中的布尔值是:“#ifdef A && B”与“#if defined(A)&& defined(B)”相同吗?
- 在一个GNU CmacrosenvSet(name)中,(void)“”的名字是什么意思?
- __FILE__,__LINE__和__FUNCTION__在C ++中的用法
- C ++预处理器__VA_ARGS__参数个数