代码之家  ›  专栏  ›  技术社区  ›  Jeremy Friesner

#ifdef宏vs-wpedantic和“extra”分号

  •  2
  • Jeremy Friesner  · 技术社区  · 8 年前

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

    #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);
    };
    

    …如果我已经定义了 -DENABLE_DEBUG_OBJECTS 在我的档案里,然后 MyClass 会有一个 DebugObject 它是一个私有成员变量,如果我没有,它就不会。

    这很好,除了一个小麻烦——如果我用clang的编译代码 -Wpedantic 标志,不带 -可变性调试对象 现在,我收到了很多关于“多余”分号的警告 private: 章节:

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

    现在,避免这种情况的两个明显方法是禁用多余的分号警告,或者将分号放在define行中,而不是将其单独放在private:section中。 类名 .

    但是,我觉得自己很顽固,所以我更喜欢把分号分开(只是出于美观的原因),我也希望能够 -wpedantic公司 没有看到这个错误就会到处出现。

    所以我的问题是:是否有一些no-op标记可以放在上面的非启用调试对象分支中? #ifdef 这会说服clang++不要抱怨分号,但对于编译器来说,这不是一个“不操作”?

    2 回复  |  直到 8 年前
        1
  •  1
  •   chris    8 年前

    微不足道的静态断言( static_assert(true, ""); )当前没有收到叮当声警告。不过,这可能会随着未来版本的变化而改变。

        2
  •  1
  •   MSalters    8 年前

    一个替代方案(工作回到C++ 98) static const int v = 0 . 由于这是一个整型常量表达式,编译器通常不需要为它分配存储空间/这使得它成为一个真正的无开销无操作。