如何在 _Pragma 的参数中连接字符串

rtp*_*pax 6 c gcc pragma c-preprocessor

_Pragma 的参数是一个字符串,所以我认为当您以正常的 c 预处理器方式将字符串粘贴在一起(即,将它们彼此相邻)时,您可以为 _Pragma 的参数形成一个新字符串。然而

_Pragma("GCC Poison " "puts")
Run Code Online (Sandbox Code Playgroud)

因错误而失败

error: _Pragma takes a parenthesized string literal
Run Code Online (Sandbox Code Playgroud)

如何规避?

这个特殊的例子不是很有用,并且有一个简单的解决方案,让它们一开始都是一个字符串,但最终目标是将一个宏字符串化到其中

rtp*_*pax 9

GNU 文档中的DO_PRAGMA宏是这样定义的

#define DO_PRAGMA(x) _Pragma (#x)
Run Code Online (Sandbox Code Playgroud)

使用此功能,如果您将两个未字符串化的单独令牌放在一起,它们将变成字符串化。要在定义中扩展宏,它必须经过一级间接,因此定义为

#define DO_PRAGMA_(x) _Pragma (#x)
#define DO_PRAGMA(x) DO_PRAGMA_(x)
Run Code Online (Sandbox Code Playgroud)

使用它,您可以为各种编译指示创建简写,如下所示

#define POISON(name) DO_PRAGMA(GCC poison name)

POISON(puts) // becomes _Pragma("GCC poison puts")
Run Code Online (Sandbox Code Playgroud)

感谢尤金·史。为我指明了DO_PRAGMA