Ermöglichen alle C ++ - Compiler die Verwendung einer statischen Const-int-Klassenmitgliedsvariablen als Array-Bindung?

8

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?

    
sharptooth 25.08.2009, 11:54
quelle

9 Antworten

4

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.

    
Michael Burr 25.08.2009, 14:17
quelle
13

Dieses Verhalten ist gemäß dem C ++ Standard gültig. Jeder neuere Compiler sollte dies unterstützen.

    
A. L. Flanagan 25.08.2009 11:59
quelle
13

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:

erhalten %Vor%

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.

    
Bojan Resnik 25.08.2009 12:19
quelle
6

Dies ist seit mehr als einem Jahrzehnt Standard C ++. Es wird sogar von VC unterstützt - was will man mehr? (@Neil: Was ist mit SunCC?% Co_de%)

    
sbi 25.08.2009 12:02
quelle
6

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.

    
StackedCrooked 25.08.2009 12:02
quelle
3

Neben anderen Antworten können Sie mit der folgenden Funktion die Anzahl der Elemente in statisch zugewiesenen Arrays bestimmen:

%Vor%     
n0rd 25.08.2009 12:53
quelle
2

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.

    
quamrana 25.08.2009 12:04
quelle
1

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.

    
AProgrammer 25.08.2009 11:57
quelle
-1

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:

  • Microsoft Visual Studio 2005 und höher ist eine relativ konforme C ++ - Implementierung. Wenn es Ihnen erlaubt, etwas zu tun, sind die Chancen sein Standard.
  • Laden Sie etwas wie Code :: Blocks herunter, um einen GCC-Compiler zum Ausprobieren zu bekommen. Wenn es in MS und GCC funktioniert, sind die Chancen wirklich, sein Standard.
Chris Becke 25.08.2009 12:06
quelle

Tags und Links