如何在 _Pragma 的参数中连接字符串
How to concatenate strings in the arguments of _Pragma
_Pragma 的参数是一个字符串,所以我认为当您以正常的 c 预处理器方式将字符串粘贴在一起时(即将它们紧挨着放置),您可以为 _Pragma 的参数形成一个新字符串.不过
_Pragma("GCC Poison " "puts")
失败并出现错误
error: _Pragma takes a parenthesized string literal
如何规避这种情况?
这个特定的例子不是很有用,并且有一个简单的解决方案,使它们都以一个字符串开头,但最终目标是将一个宏字符串化到其中
DO_PRAGMA
宏in the GNU docs是这样定义的
#define DO_PRAGMA(x) _Pragma (#x)
使用这个,如果你把两个单独的非字符串化的标记放在一起,它们就会变成字符串化的。要在定义内扩展宏,必须经过一层间接寻址,所以定义为
#define DO_PRAGMA_(x) _Pragma (#x)
#define DO_PRAGMA(x) DO_PRAGMA_(x)
使用它,您可以像这样为各种编译指示创建速记
#define POISON(name) DO_PRAGMA(GCC poison name)
POISON(puts) // becomes _Pragma("GCC poison puts")
感谢 Eugene Sh。为我指出 DO_PRAGMA
宏
_Pragma 的参数是一个字符串,所以我认为当您以正常的 c 预处理器方式将字符串粘贴在一起时(即将它们紧挨着放置),您可以为 _Pragma 的参数形成一个新字符串.不过
_Pragma("GCC Poison " "puts")
失败并出现错误
error: _Pragma takes a parenthesized string literal
如何规避这种情况?
这个特定的例子不是很有用,并且有一个简单的解决方案,使它们都以一个字符串开头,但最终目标是将一个宏字符串化到其中
DO_PRAGMA
宏in the GNU docs是这样定义的
#define DO_PRAGMA(x) _Pragma (#x)
使用这个,如果你把两个单独的非字符串化的标记放在一起,它们就会变成字符串化的。要在定义内扩展宏,必须经过一层间接寻址,所以定义为
#define DO_PRAGMA_(x) _Pragma (#x)
#define DO_PRAGMA(x) DO_PRAGMA_(x)
使用它,您可以像这样为各种编译指示创建速记
#define POISON(name) DO_PRAGMA(GCC poison name)
POISON(puts) // becomes _Pragma("GCC poison puts")
感谢 Eugene Sh。为我指出 DO_PRAGMA
宏