我一直在为新的C ++ 0x类型安全枚举重构我可怕的C ++类型安全psuedo-enums,因为它们方式更具可读性。无论如何,我在导出的类中使用它们,所以我明确地将它们标记为要导出:
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
进行编译,这让我感到不舒服。我真的希望看到这个问题消失。
答案 0 :(得分:4)
您可以传递-Wno-attributes
标志以关闭警告。
(这可能是gcc中的一个错误?)
答案 1 :(得分:4)
以下列方式使用g ++ 4.8.2对我有用:
enum class MyEnum : unsigned int
__attribute__((visibility("default")))
{
One = 1,
Two = 2
};
(更改attribute
声明的位置)