如何实现为_Pragma创建带引号的字符串的宏?

Thr*_*Bit 6 c macros pragma stringify

我想要一个像这样调用的宏:

GCC_WARNING(-Wuninitialized)
Run Code Online (Sandbox Code Playgroud)

它扩展为这样的代码:

_Pragma("GCC diagnostic ignored \"-Wuninitialized\"")
Run Code Online (Sandbox Code Playgroud)

我没有运气让这个工作,因为预处理器加入和字符串化的常用技巧似乎不适用或我不知道如何在这里应用它们.

Lin*_*cer 15

在预处理器魔法的帮助下:

#define HELPER0(x) #x
#define HELPER1(x) HELPER0(GCC diagnostic ignored x)
#define HELPER2(y) HELPER1(#y)
#define GCC_WARNING(x) _Pragma(HELPER2(x))

GCC_WARNING(-Wuninitialized)
Run Code Online (Sandbox Code Playgroud)


Fre*_*abe 0

如果宏参数用单引号引起来也可以接受吗?如果是这样,你可以使用这个:

#define GCC_WARNING(x) _Pragma("GCC diagnostic ignored '" #x "'")
Run Code Online (Sandbox Code Playgroud)

当调用它时,GCC_WARNING(-Wuninitialized)它会扩展为

_Pragma("GCC diagnostic ignored '" "-Wuninitialized" "'")
Run Code Online (Sandbox Code Playgroud)

我必须在这里利用 C 的字符串连接行为(printf("a" "b");与 相同printf("ab");),因为"'#x'"在宏中使用可以避免x扩展。

  • 事实上`_Pragma`不是GCC特定的。它是 C99 标准的一部分,允许宏扩展为编译指示。然而,用户询问了 GCC 特定的用例,但该问题对于通用编译指示仍然有效。 (2认同)