Was bedeutet "statische Aufzählung" in C ++?
Kurzem stieß ich auf dieses:
static enum Response{
NO_ERROR=0,
MISSING_DESCRIPTOR,
...
};
Es kompiliert und funktioniert unter Microsoft VS2005. Allerdings bin ich mir nicht sicher, was die 'statische' modifier tun soll. Ist es da anders aus?
enum Response {
NO_ERROR=0,
MISSING_DESCRIPTOR,
...
};
Kommentar zu dem Problem
Ist es in einer header-Datei oder einer cpp-Datei?
Habe es gerade ausprobiert in Visual Studio 2008 und es kompiliert ohne Beanstandung auch dort. Komisch.
Zu klären sein in einem .cpp-Datei, und es gibt keine Variablennamen zwischen } und ; Es ist keine Deklaration von Variablen.
Alle Compiler haben Fehler 🙂
Auf der msdn-Seite detailliert, wie deklarieren Sie eine
enum
in VS2005, VS2008 und VS2010 (msdn.microsoft.com/en-us/library/2dzy4k6e.aspx) macht keine Erwähnung von static
. Wahrscheinlich ein bug, der es ermöglicht es dann. InformationsquelleAutor der Frage Marcin K | 2011-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass der genaue code, nur mit der Ellipse entfernt, ist kein gültiges C++. Sie können nicht die
static
storage class specifier in einemenum
Erklärung; es macht keinen Sinn es (nur Objekte, Funktionen und anonyme Gewerkschaften erklärt werden kannstatic
).Können Sie jedoch deklarieren Sie eine
enum
und eine variable in einer Erklärung:Den
static
hier giltx
und es ist effektiv das gleiche, als wenn Sie sagte:InformationsquelleAutor der Antwort James McNellis
Überraschend Sie können andere decl-Bezeichner auch drin.
Dies stellt Geldstrafe in VS2008:
Aber es macht überhaupt keinen Sinn 🙂
Ich vermute, das problem liegt hier in der Analyse, da der code wie dieser:
Könnte auch geschrieben werden als:
Interessanterweise habe ich bemerkt, wenn Sie dies tun, in VS2008:
So dass Sie nicht gleichwertig sind wie in der
TestEnum4
Fall scheint es wegwerfen derconst
decl-specifier. Alles sehr seltsam.InformationsquelleAutor der Antwort GrahamS
Nicht definieren
static
enum in C++.static
nur die variable der enum nicht die Typ selbst!Den code zu kompilieren mit
GCC
version4.3.4
es gibt diese Fehlermeldung:Sehen Sie sich online bei ideone: http://www.ideone.com/cI1bt
Ich denke, das sagt alles.
--
Jedoch, wenn Sie wollen, zu begrenzen, die Typ
enum Response
im eigenen übersetzungseinheit, dann können Sie Unbenannte namespace. Haben Sie einen Blick auf dieses Thema:Überlegenheit Unbenannte namespace gegenüber statischen?
InformationsquelleAutor der Antwort Nawaz
Standard
Den C++11 N3337 standard-Entwurf Anhang C 7.1.1 sagt, dass es erlaubt war in C, aber hatte keine Wirkung, und wurde illegal in C++:
Und wie
struct
,enum
ist auch eine Art Erklärung.Umsetzung Begründung
Enum-Definitionen haben keine Lagerung, und nicht generieren Symbole im Objekt-Dateien wie Variablen und Funktionen. Versuchen Sie einfach, die Kompilierung und Dekompilierung:
mit:
, und Sie werden sehen, dass es keine
S
symbol, aber es ist eini
symbol.Wenn der compiler auf eine enum-Werte, nur fügt es buchstäblich in den kompilierten code. Dies funktioniert nur, natürlich, weil Sie sind compile-Zeit-Konstanten.
Müssen Sie deshalb auf die header-Dateien.
Siehe auch:
static struct
in C: Warum und Wann die Verwendung von statischen Strukturen in der C-Programmierung?InformationsquelleAutor der Antwort Ciro Santilli 包子露宪 六四事件 法轮功
In C#:
Dem ';' ist optional für die Abwärtskompatibilität nach der enum-block. Es tut nicht ermöglichen solche Semantik in dieser Sprache für die benannten Typen. static, public, etc. haben, Besondere Berücksichtigung. Namespace enthalten, nicht-Mitglieder wie Felder oder Methoden.
Erfordert Tags:
In C/C++:
Erfordert ';' am Ende der enum-block.
Für den globalen namespace Variablen, Aufzählungen, etc. statische ist standardmäßig aktiviert.
InformationsquelleAutor der Antwort Latency
Im nicht sicher, warum static verwendet wurde oder warum es selbst kompiliert. Sollte nur enum-Antwort.
Enumeratoren sind nicht statische Daten.
InformationsquelleAutor der Antwort JonH