In VC ++, wenn ich ein Array für eine Klassenmitgliedsvariable angeben muss, mache ich es so:
%Vor%(Bitte erzähl mir nicht von der Verwendung von std :: vector hier)
Auf diese Weise habe ich eine Konstante, die als eine Array-Grenze und später im Klassencode verwendet werden kann, um Schleifen-Anweisungsbedingungen anzugeben und gleichzeitig nirgendwo anders sichtbar ist.
Die Frage ist, ob diese Verwendung von static const int
-Membervariablen nur von VC ++ erlaubt wird oder ist es normalerweise von anderen weit verbreiteten Compilern erlaubt?
Ja, es ist 100% legal und sollte tragbar sein. Der C ++ - Standard sagt das in 5.19 - Konstante Ausdrücke "(Hervorhebung von mir):
An mehreren Stellen benötigt C ++ Ausdrücke, die zu einer Integral- oder Enumerationskonstante ausgewertet werden: als Array-Grenzen (8.3.4, 5.3.4), als Case-Ausdrücke (6.4.2), als Bitfeldlängen (9.6) , als Enumerator-Initialisierer (7.2), als statische Member-Initialisierer (9.4.2) und als Integral- oder Enumerations-Nicht-Typ-Template-Argumente (14.3).
%Vor%Ein ganzzahliger Konstantenausdruck kann nur Literale (2.13), Enumeratoren, const-Variablen oder statische Datenelemente von Integral- oder Enumerationstypen, die mit konstanten Ausdrücken initialisiert sind (8.5), nicht-type template-Parameter von Integral- oder Aufzählungstypen und Größe von Ausdrücken.
Es scheint, dass VC6 es nicht unterstützt. Siehe Die Antwort von StackedCrooked für eine gute Problemumgehung. Tatsächlich bevorzuge ich generell die enum
Methode StackedCrooked Erwähnungen für diese Art von Sache.
Als eine FYI funktioniert die " static const
" Technik in VC9, GCC 3.4.5 (MinGW), Comeau und Digital Mars.
Und vergiss nicht, dass du, wenn du ein "'static const'" Mitglied benutzt, brauchen eine Definition dafür zusätzlich zu der Deklaration streng genommen. Praktisch alle Compiler lassen Sie jedoch in diesem Fall die Definition überspringen.
Dieses Verhalten ist gemäß dem C ++ Standard gültig. Jeder neuere Compiler sollte dies unterstützen.
Dies ist gültig C ++ und die meisten (alle?) einigermaßen modernen Compiler unterstützen es. Wenn Sie boost verwenden, können Sie portable Unterstützung für diese Funktion in Form von BOOST_STATIC_CONSTANT
macro:
Das Makro wird auf static const int numberOfColors = 16
erweitert, wenn der Compiler dies unterstützt, andernfalls greift es auf enum { numberOfColors=16 };
zurück.
Ich glaube, dass Visual Studio 2005 und darüber hinaus dies unterstützen. Der XCode C ++ Compiler auch (das ist gcc eigentlich).
Wenn Sie sicher sein wollen, können Sie immer den alten Enum-Hack verwenden, den ich von Effective C ++ gelernt habe. Es geht so:
%Vor%Hoffe, das hilft.
Ich bin mir ziemlich sicher, dass dies auch mit gcc und Solaris funktionieren wird, aber ich kann das im Moment nicht überprüfen.
In Zukunft könnte man die Idee so erweitern:
%Vor%und benutze es so:
%Vor%, damit Sie in Ihrer Anwendung nicht auf genau eine Puffergröße beschränkt sind.
Ich habe aufgehört, mich über die Tragbarkeit von damals zu ärgern. Es gibt vielleicht noch Compiler, die das nicht unterstützen, aber ich habe in letzter Zeit keine von ihnen getroffen.
Es ist möglich, Fragen wie diese zu beantworten, indem auf die ISO C ++ - Spezifikation verwiesen wird, aber die Spezifikation ist schwer für die Leute zu bekommen und schwerer zu lesen. Ich denke, die einfachste Antwort hängt von zwei Dingen ab:
Tags und Links const c++ visual-c++ static