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

Dav*_*tti 3 warnings clang suppress-warnings

上下文

我阅读了Clang的"通过编类控制诊断"部分关于关闭特定警告的内容.除了-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
Run Code Online (Sandbox Code Playgroud)

问题

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

信封

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

操作系统:Mac OS X 10.9.5

Jef*_*eff 5

这似乎适用于Xcode 6.4(6E35b).该pragma现在禁止警告.

我有-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
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

#define DEBUG
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
#import "Macros.h"
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)


mad*_*127 5

由于这个答案是 clang 错误的最佳结果:

',' 和 VA_ARGS 的标记粘贴是 GNU 扩展

C++20 不需要标记粘贴运算符 ( ##__VA_ARGS__),常规的__VA_ARGS__即可工作。

请参阅此处的示例