如何在使用Clang时关闭-Wgnu-zero-variadic-macro-arguments警告?

3

背景

我阅读了Clang的“通过Pragmas控制诊断”一节,了解如何关闭特定警告。通常情况下,它适用于所有警告,但对于-Wgnu-zero-variadic-macro-arguments则不起作用。

代码如下:

MyHeader.hpp

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"

#import "header generating -Wgnu-zero-variadic-macro-arguments warning"

#pragma clang diagnostic pop

问题

在编译导入MyHeader.hpp的翻译单元时,Clang会生成-Wgnu-zero-variadic-macro-arguments警告。

环境

Clang版本: Apple LLVM版本6.0(基于LLVM 3.5svn) 目标:x86_64-apple-darwin13.4.0 线程模型:posix

操作系统:Mac OS X 10.9.5

3个回答

5
这似乎能在Xcode 6.4 (6E35b)中运作。现在,这个编译指示消除了警告。
我的构建设置中有"-Weverything"。没有忽略诊断时,我绝对会收到警告:
“逗号和__VA_ARGS__的拼接是GNU扩展”。
与您的Env部分匹配的终端输出:
$ clang --version
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix

使用以下代码:
#define DEBUG
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
#import "Macros.h"
#pragma clang diagnostic pop

在Macros.h中包含以下内容:

#ifdef DEBUG
#define AssLog(condition, message, ...) NSAssert(condition, message, ##__VA_ARGS__)
#else
#define AssLog(condition, message, ...) if (!condition) NSLog((@"%@ [Line %d] " message), [NSString stringWithUTF8String:__PRETTY_FUNCTION__], __LINE__, ##__VA_ARGS__)
#endif

3

由于这篇回答在clang错误的最高搜索结果中:

逗号和__VA_ARGS__的粘合是GNU的一个扩展

C++20不需要使用粘合运算符(##__VA_ARGS__),普通的__VA_ARGS__就可以工作。

点击这里查看示例


1
接受的答案对于此特定问题有效,但是如果您想要实际消除警告而不是隐藏它,则可以使用-std = gnu ++ 11-std = gnu ++ 1y 或任何适用于您的代码库的相关GNU兼容标准进行编译。我遇到了相同的警告,需要一些挖掘才能意识到它试图告诉我什么。这是针对CLang ++的,但应该有GCC等效物。
相关警告

“,”和 VA_ARGS 的拼接是GNU扩展

环境
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接