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

#ifdef macros vs -Wpedantic and "extra" semicolons

本文关键字:extra 分号 宏与 -Wpedantic #ifdef      更新时间:2023-10-16

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

#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的私有:部分中。

但是,我感到固执,所以我宁愿将分号分开(只是出于美学原因(,我也希望能够启用-Wpedantic而不会看到此错误到处弹出。

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

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

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