#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
。由于这是一个完整的常量表达式,编译器通常不需要为其分配存储/这使它成为真正的无开销无操作。
我的代码库有一个头文件,其中包含这个预处理器魔法:
#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
。由于这是一个完整的常量表达式,编译器通常不需要为其分配存储/这使它成为真正的无开销无操作。