我想要一个像这样调用的宏:
GCC_WARNING(-Wuninitialized)
扩展为这样的代码:
_Pragma("GCC diagnostic ignored \"-Wuninitialized\"")
我没有运气让它工作,因为预处理器连接和字符串化的常用技巧似乎不适用,或者我不知道如何在这里应用它们。
在预处理器魔法的帮助下:
#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)
如果宏参数用单引号括起来也可以接受吗?如果是这样,你可以使用这个:
#define GCC_WARNING(x) _Pragma("GCC diagnostic ignored '" #x "'")
当调用它时,GCC_WARNING(-Wuninitialized)
它会扩展为
_Pragma("GCC diagnostic ignored '" "-Wuninitialized" "'")
我不得不在这里使用 C 的字符串连接行为(printf("a" "b");
与 相同printf("ab");
),因为"'#x'"
在宏中使用可以避免这种x
情况被扩展。