#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
作为私有成员变量,或者如果我没有,它就不会。
这工作正常,除了一个小烦恼 - 如果我使用 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
。由于这是一个完整的常量表达式,编译器通常不需要为其分配存储/这使它成为真正的无开销无操作。
相关文章:
- 当我们为(;;) 写作时,它做了什么?for 循环中的双分号有什么作用?
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 如何逐行从文件中获取单词,并在C++中用分号分隔?
- 从文件中读取后,将分号分隔的整数存储到数组中
- 编译代码时"[Warning] extra tokens at end of"
- 为什么 C++ 中的分号在插入代码开头时不显示任何错误?
- C++ "extra"头文件
- 为什么要在 c/c++ 中直接写一个文字后跟一个分号?
- #ifdef 宏与 -Wpedantic 和 "extra" 分号
- 从 VSStudio 获得 C2628 奇怪的错误,那里的所有分号
- for循环块之后的分号
- 在结构声明的分号之前声明的结构变量是否为全局变量
- 缺少分号:C++或SWIG问题?
- 是否可以在 for 循环条件括号内使用三个分号?
- for 循环后的分号是什么意思?为什么第一个循环语句中有 j++
- 在 Codelite 中的类定义后自动插入分号
- 如何防止 clang 格式向新行添加单个分号
- 将 C++ 类属性与分号前面的最后一个单词对齐;在 emacs 中
- 我是否应该在包含语句的末尾添加分号
- 即使我没有 #define 任何东西或错过分号,如何修复"expected unqualfied-id before string constant"?