#ifdef macros vs -Wpedantic和“extra”分号

时间:2018-05-23 02:46:23

标签: c++ warnings preprocessor clang++

我的代码库有一个包含这个预处理器魔法的头文件:

#ifdef ENABLE_DEBUG_OBJECTS
# define DECLARE_DEBUG_OBJECT(v) DebugObject obj(v)
#else
# define DECLARE_DEBUG_OBJECT(v)
#endif

我的想法是,在其他头文件的各种类中,我可以这样做:

class MyClass
{
public:
   MyClass() {}

private:
   DECLARE_DEBUG_OBJECT(123);
};

...如果我在Makefile中定义了-DENABLE_DEBUG_OBJECTS,那么MyClass将会有一个DebugObject作为私有成员变量,或者如果我没有,它不会。

这很好,除了一个小烦恼 - 如果我用clang的-Wpedantic标志编译我的代码,并且没有-DENABLE_DEBUG_OBJECTS存在,我会收到很多关于“额外”分号的警告在private:部分:

$ clang++ -Wpedantic ./test.cpp
./test.cpp:14:29: warning: extra ';' inside a class [-Wextra-semi]
DECLARE_DEBUG_OBJECT(123);

现在有两种避免这种情况的明显方法是禁用分号后警告,或者将分号放入#define行,而不是将其分隔在MyClass的private:部分中。< / p>

然而,我感觉很顽固,所以我更喜欢将分号分开(仅仅出于审美原因),而且我也希望能够启用-Wpedantic而不会看到此错误弹出到处都是。

所以我的问题是:是否有一些无操作的令牌,我可以放入上述#ifdef的非ENABLE_DEBUG_OBJECTS分支,以说服clang ++不要抱怨分号,但否则就是无操作就编译器而言?

2 个答案:

答案 0 :(得分:1)

目前没有为Clang警告选择一个简单的静态断言(static_assert(true, "");)。然而,这可能会随着未来的版本而改变。

答案 1 :(得分:1)

另一种选择(回到C ++ 98)将是static const int v = 0。由于这是一个完整的常量表达式,编译器通常不需要为它分配存储/这使得它成为一个真正的无开销的无操作。