2010-03-17 58 views
7

我一直在重構我的C++類型安全僞枚舉的可怕混亂到新的C++ 0x類型安全的枚舉,因爲他們方式更具可讀性。總之,我使用它們導出類,所以我明確地將它們標記要導出:g ++ 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,這讓我感到不舒服。我真的很想看到這個問題消失。

回答

3

您可以通過-Wno-attributes標誌關閉警告。

(這也可能是在海灣合作委員會的錯誤嗎?)

+1

我向GCC的Bugzilla報告了這個bug。 – 2010-03-18 01:58:16

+1

@TravisGockel:你能指點我那張票嗎?我已在下面發佈解決方法。 – erenon 2015-01-16 16:51:07

+0

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43407 – vpicaver 2016-01-15 05:31:25

1

它爲我用G ++ 4.8.2方式如下:

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

(改變attribute聲明的位置)