2010-03-17 13 views
7

Ich habe mein schreckliches Durcheinander von C++ typsichere psuedo-Aufzählungen zur neuen C++ 0x typsichere Aufzählungen Refactoring, weil sie Weise besser lesbar ist. Wie auch immer, ich benutze sie in exportierten Klassen, so dass ich markieren explizit exportiert werden:g ++ C++ 0x Enum Klasse Compiler-Warnungen

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

diese Kompilieren mit g ++ liefert die folgende Warnung:

Typ Attribute ignoriert nach Art bereits

definiert ist

Dies scheint sehr seltsam, da, soweit ich weiß, dass Warnung gemeint ist, wie tatsächliche Fehler zu vermeiden:

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

Natürlich mache ich das natürlich nicht, da ich nur die Sichtbarkeitsattribute bei der Definition des enum class markiert habe und ich es nirgendwo anders neu definiere oder deklariere (Ich kann diesen Fehler mit einem kopieren einzelne Datei).

Letztendlich kann ich dieses Bit Code tatsächlich kein Problem verursachen, abgesehen von der Tatsache, dass, wenn ich einen Wert ändern und den Consumer neu kompilieren, ohne die gemeinsam genutzte Bibliothek neu zu kompilieren, der Verbraucher das neue übergibt Werte und die gemeinsame Bibliothek hat keine Ahnung, was man mit ihnen machen soll (obwohl ich nicht erwarten würde, dass das überhaupt funktioniert).

Bin ich viel zu pedantisch? Kann das sicher ignoriert werden? Ich vermute das, aber zur gleichen Zeit, verhindert dieser Fehler mich mit Werror zu kompilieren, was mich unbehaglich macht. Ich würde wirklich gerne dieses Problem verschwinden sehen.

Antwort

3

Sie können das Flag -Wno-attributes übergeben, um die Warnung zu deaktivieren.

(es ist wahrscheinlich ein Fehler in gcc?)

+1

I meldete den Bug dem GCC Bugzilla. –

+1

@TravisGockel: Könnten Sie mich bitte auf dieses Ticket hinweisen? Ich habe unten einen Workaround veröffentlicht. – erenon

+0

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43407 – vpicaver

1

Es funktioniert für mich mit g ++ 4.8.2 die folgende Art und Weise:

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

(die Position der attribute Erklärung ändern)