我的代码库有一个包含这个预处理器魔法的头文件:
#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 ++不要抱怨分号,但否则就是无操作就编译器而言?
答案 0 :(得分:1)
目前没有为Clang警告选择一个简单的静态断言(static_assert(true, "");
)。然而,这可能会随着未来的版本而改变。
答案 1 :(得分:1)
另一种选择(回到C ++ 98)将是static const int v = 0
。由于这是一个完整的常量表达式,编译器通常不需要为它分配存储/这使得它成为一个真正的无开销的无操作。