如何在宏之后需要分号

问题描述 投票:3回答:2

所以我正在编写一个库,必须使用-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个警告?

c++ c-preprocessor compiler-warnings suppress-warnings
2个回答
4
投票

您可以在宏的末尾添加一个函数声明:

#define TESTSUITE(name)  \
//...                    \
void ANONYMOUS_FUNCTION()

Demo

在不同的TESTSUITE宏中,函数名称甚至不必是不同的。如果它没有在其他任何地方使用它就足够了,所以它不会参与任何重载。


0
投票

我在宏的末尾使用enum {}来强制分号。

这适用于类和函数内部和外部。

此方法不会污染任何名称空间,也不会生成任何代码。

© www.soinside.com 2019 - 2024. All rights reserved.