g++: tableau lié n'est pas une constante entière
Avec le code,
const double rotationStep = 0.001;
const int N = 2*int(M_PI/rotationStep) + 3;
static unsigned int counts[N];
g++
donne l'erreur:
tableau lié n'est pas une constante entière avant »]« jeton
Je suis en utilisant g++
/gcc
version 4.6.1
Quelqu'un peut-il me dire pourquoi g++
se plaint de l'expression?
S'il vous plaît, pouvez-vous supprimer le
Elle est définie par l'implémentation du comportement (lors de l'évaluation de l'expression qui est).
ne compile pas sans mot-clé static, soit
static
jeton de votre code et de recompiler?Elle est définie par l'implémentation du comportement (lors de l'évaluation de l'expression qui est).
ne compile pas sans mot-clé static, soit
OriginalL'auteur user765269 | 2012-06-29
Vous devez vous connecter pour publier un commentaire.
Comme le standard ISO C++ de 2003, ce n'est pas un partie intégrante de la constante d'expression. Citant l'article 5.19 de la norme:
Vous pouvez changer ce:
:
(En supposant
M_PI
est défini quelque part; il n'est pas spécifié dans la norme, mais c'est une extension commune.)2011 standard ISO C++ se desserre à ce un peu. 5.19p3 (citant le N3337 projet) dit:
Je pense
2*int(M_PI/rotationStep) + 3
, et doncN
, est admissible en vertu des nouvelles règles, mais il est probable que votre compilateur ne permet pas encore de les mettre en œuvre.OriginalL'auteur Keith Thompson
Le problème, c'est que...
Un
const
valeur n'est pas une expression constante (même si il est assez facile de comprendre pourquoi ce serait vous tromper).EDIT: j'ai supposé que C quand j'ai lu cela. Le problème ici est que cette expression n'est pas évaluée au moment de la compilation:
Alors que ce serait
@Ildjarn noté dans les commentaires, arithmétique à virgule flottante n'est pas garanti d'être évalués au moment de la compilation. Voici une SORTE de post que j'ai trouvé.
Si GCC, vous pouvez utiliser constexpr...
L'arithmétique en virgule flottante n'est pas garanti d'être effectué au moment de la compilation comme partie intégrante de l'arithmétique.
J'étais en train de penser C quand j'ai lu cela (qui a une définition plus restrictive de ce qui constitue une expression constante), pas du C++. Le problème est que l'expression est pas évaluée au moment de la compilation.
Essayez de compiler avec
g++ -pedantic
. J'obtiens un "avertissement: ISO C++ forbids de longueur variable array ‘compte’ [-Wvla]". (g++ est non-conforme par défaut.)OriginalL'auteur Ed S.
Comme Ed l'a déjà souligné, les optimisations des opérations en virgule flottante, y compris la réduction des constantes, ne sont pas garantis pour arriver au moment de la compilation. Intel page sur le sujet donne quelques exemples, mais principalement c'est que l'arrondi comportement peut être différent et que les opérations à virgule flottante peut lancer des exceptions. Ce document va un peu plus en profondeur (section 8.3, "l'Arithmétique de Réduction").
GCC ne fait que du soutien
comme mentionné dans la description de la ffp-contrat de drapeau dans le les optimisations du compilateur manuel.
Oh, oui. Fixe (je pense). Merci 🙂
OriginalL'auteur niko