所以我正在编写一个库,必须使用-pedantic -ansi -std=c++98 -Werror
和-Weverything
为clang和-Wall -Wextra
构建gcc,我有这个宏TESTSUITE(X)
,它打算在全球范围内使用,如下所示:
TESTSUITE(current testsuite);
它的作用是用字符串调用函数(在初始化虚拟var的程序启动时):
#define TESTSUITE(name) \
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name)
问题是,这会在-Wglobal-constructors
的clang下产生警告。
如果我用这样的_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个警告?
您可以在宏的末尾添加一个函数声明:
#define TESTSUITE(name) \
//... \
void ANONYMOUS_FUNCTION()
在不同的TESTSUITE
宏中,函数名称甚至不必是不同的。如果它没有在其他任何地方使用它就足够了,所以它不会参与任何重载。
我在宏的末尾使用enum {}
来强制分号。
这适用于类和函数内部和外部。
此方法不会污染任何名称空间,也不会生成任何代码。