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?
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 undsizeof
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.
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.
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.