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

_Pragma("GCC Poison " "puts")

失败并显示错误
error: _Pragma takes a parenthesized string literal

如何避免这种情况?

这个特定的例子不是很有用,它有一个简单的解决方案,使它们以一个字符串开头,但是最终目标是将一个宏串入其中

最佳答案

像这样定义DO_PRAGMAin 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

10-08 00:41