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

标签 c gcc c-preprocessor pragma

_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

关于c - 如何在 _Pragma 的参数中连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45762357/

相关文章:

c - 确定 C 字符串是否是 C 中的有效 int

c++ - 最快的加密安全随机数生成器

C 从文件中读入字符串,拆分成数组

c - @zero_extendqisi2 的含义

c++ - #include 是否也意味着使用

c - C 中类似函数的宏定义

c - 如果你将一个 big int 转换为 float 会发生什么

c++ - 返回指向不可修改成员数组的指针 C++ gcc 警告

c - GCC quad 大小 32 位和 64 位

c - 如何以编程方式将整数映射到 const 字符串?