#ifdef 宏与 -Wpedantic 和 "extra" 分号

#ifdef macros vs -Wpedantic and "extra" semicolons

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

#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 作为私有成员变量,或者如果我没有t,不会的。

这工作正常,除了一个小烦恼——如果我用 clang 的 -Wpedantic 标志编译我的代码,并且没有 -DENABLE_DEBUG_OBJECTS 存在,我会收到很多关于 "extra" private: 部分中的分号:

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

现在有两种明显的避免这种情况的方法是禁用额外分号警告,或者将分号放入#define 行而不是将其单独放在 MyClass 的 private: 部分.

但是,我觉得很固执,所以我更愿意将分号分开(只是出于美观原因),而且我也希望能够启用 -Wpedantic 而不会看到这个到处都弹出错误。

所以我的问题是:是否有一些空操作标记我可以放入上面 #ifdef 的 non-ENABLE_DEBUG_OBJECTS 分支中,这将说服 clang++ 不要抱怨分号,否则就编译器而言是空操作?

一个微不足道的静态断言 (static_assert(true, "");) 目前没有被 Clang 警告选中。但是,这可能会随着未来的版本而改变。

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