【问题标题】:g++ C++0x enum class Compiler Warningsg++ C++0x 枚举类编译器警告
【发布时间】:2010-03-17 14:39:10
【问题描述】:

我一直在将我糟糕的 C++ 类型安全伪枚举重构为新的 C++0x 类型安全枚举,因为它们方式更具可读性。无论如何,我在导出的类中使用它们,所以我明确地将它们标记为要导出:

enum class  __attribute__((visibility("default"))) MyEnum : unsigned int
{
    One = 1,
    Two = 2
};

使用 g++ 编译会产生以下警告:

在类型已经定义后忽略类型属性

这似乎很奇怪,因为据我所知,该警告旨在防止出现以下实际错误:

class __attribute__((visibility("default"))) MyClass { };
class __attribute__((visibility("hidden")))  MyClass;

当然,我显然没有这样做,因为我只在 enum class 的定义处标记了可见性属性,并且我没有在其他任何地方重新定义或声明它(我可以用单个文件)。

最终,我不能让这段代码真正引起问题,除非我更改一个值并重新编译消费者而不重新编译共享库,消费者会传递新值并且共享库不知道如何处理它们(尽管我不希望它首先起作用)。

我是不是太迂腐了?这可以安全地忽略吗?我怀疑是这样,但同时,出现此错误会阻止我使用Werror 进行编译,这让我感到不舒服。我真的很想看到这个问题消失。

【问题讨论】:

    标签: c++ g++ c++11 compiler-warnings


    【解决方案1】:

    您可以传递-Wno-attributes 标志来关闭警告。

    (这可能是 gcc 中的错误?)

    【讨论】:

    • 我向 GCC 的 Bugzilla 报告了这个错误。
    • @TravisGockel:你能指点我那张票吗?我在下面发布了一个解决方法。
    【解决方案2】:

    它适用于我的 g++ 4.8.2,方式如下:

    enum class MyEnum : unsigned int
    __attribute__((visibility("default")))
    {
        One = 1,
        Two = 2
    };
    

    (改变attribute声明的位置)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多