g ++: Array gebunden ist keine Integer-Konstante

8

Mit dem Code

%Vor%

g++ gibt den Fehler:

  

Array gebunden ist keine Integer-Konstante vor »]« token

Ich verwende g++ / gcc Version 4.6.1

Kann mir jemand sagen, warum g++ sich über den Ausdruck beschwert?

    
user765269 29.06.2012, 22:15
quelle

3 Antworten

7

Nach dem ISO C ++ Standard von 2003 ist das kein Integralkonstantenausdruck . Zitat aus Abschnitt 5.19 des Standards:

  

Ein Integral-Konstanten-Ausdruck kann nur Literale enthalten (2.13),   Enumeratoren, const Variablen oder statische Datenelemente von Integral oder   Aufzählungstypen, die mit konstanten Ausdrücken initialisiert wurden (8.5),   Nicht-Typ-Template-Parameter von Integral- oder Enumerationstypen und    sizeof Ausdrücke. Fließende Literale (2.13.3) können nur erscheinen, wenn   Sie werden in Integral- oder Enumerationstypen umgewandelt.

Du könntest das ändern:

%Vor%

dazu:

%Vor%

(Das geht davon aus, dass M_PI irgendwo definiert ist; es ist nicht im Standard spezifiziert, aber es ist eine übliche Erweiterung.)

Der ISO-C ++ - Standard von 2011 löst das ein wenig auf. 5.19p3 (Zitat des N3337-Entwurfs) sagt:

  

Ein Integralkonstantenausdruck ist ein Literalkonstantenausdruck von   integraler oder nicht gekürzter Aufzählungstyp.

Ich denke 2*int(M_PI/rotationStep) + 3 und daher N , qualifiziert sich unter den neuen Regeln, aber Ihr Compiler implementiert sie wahrscheinlich noch nicht.

    
Keith Thompson 29.06.2012, 22:50
quelle
4

Das Problem ist, dass ...

%Vor%

Ein const Wert ist kein konstanter Ausdruck (obwohl es ziemlich verständlich ist, warum Sie das verwirren würde).

EDIT: Ich habe C angenommen, als ich das zuerst las. Das Problem hierbei ist, dass dieser Ausdruck zur Kompilierzeit nicht ausgewertet wird:

%Vor%

Dies wäre

%Vor%

Wie @ildjarn in den Kommentaren notiert hat, ist es nicht garantiert, dass Fließkommarithmetik zur Kompilierzeit ausgewertet wird. Hier ist eine ähnliche SO-Post, die ich gefunden habe.

    
Ed S. 29.06.2012 22:16
quelle
1

Wie bereits von Ed hervorgehoben, können Optimierungen von Gleitkommaoperationen, einschließlich konstanter Faltung, nicht zur Kompilierzeit garantiert werden. Seite von Intel zu dem Thema gibt ein paar Beispiele, aber hauptsächlich ist es, dass das Rundungsverhalten anders sein kann und dass Gleitkommaoperationen Ausnahmen auslösen können. Dieser Artikel geht ein wenig tiefer (Abschnitt 8.3, "Arithmetische Reduktion").

GCC unterstützt nur

  

"Gleitkommaausdruck-Kontraktion wie das Bilden von fusionierten Multiply-Add-Operationen, wenn das Ziel native Unterstützung für sie hat"

wie in der Beschreibung für das ffp-contract-Flag im Compiler-Optimierungshandbuch erwähnt.

    
niko 29.06.2012 22:51
quelle

Tags und Links