【发布时间】:2016-06-02 12:49:03
【问题描述】:
所以我正在编写一个库,它必须使用-pedantic -ansi -std=c++98 -Werror 和-Weverything 构建clang 和-Wall -Wextra 构建gcc,我有这个宏TESTSUITE(X),它打算在全局范围内使用,如下所示:
TESTSUITE(current testsuite);
它的作用是用字符串调用一个函数(在程序启动时通过初始化一个虚拟变量):
#define TESTSUITE(name) \
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name)
问题是这会在clang 下为-Wglobal-constructors 生成警告。
如果我像这样用_Pragma 包围它:
#define TESTSUITE(name) \
_Pragma("clang diagnostic push"); \
_Pragma("clang diagnostic ignored \"-Wglobal-constructors\""); \
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name) \
_Pragma("clang diagnostic pop")
编译时不需要使用宏后的分号(如果缺少它,-pedantic 会报错)。
如果我在宏的末尾添加这个
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = 5
分号是必需的,但我会收到一个未使用变量的警告,我无法将其静音(因为如果我用 _Pragma 语句包围它,我将回到不需要分号的方块 1)。
那么有谁知道我如何要求分号并且还有 0 个警告?
【问题讨论】:
-
要在启动时调用一个函数,你可以给它非标准的
__attribute((constructor))__。 -
@chris 很高兴知道 - 谢谢。但我更喜欢我已经拥有的解决方案,因为我还必须处理 Windows 编译器,并且拥有相同的宏集对我来说更好
-
是的,looks complicated。如果有什么安慰的话,Visual Studio 现在可以使用 Clang。
标签: c++ c-preprocessor compiler-warnings suppress-warnings