2010-12-16 2 views
3

Ceci est mon code:Comment le compilateur pense-t-il que cette variable n'est pas constante?

int main() 
{ 
const int LEN = 5; 
int x[LEN]; 
} 

VS10 dit:

erreur C2057: attendue constante expression

erreur C2466: ne peut pas allouer un tableau de taille constante 0

erreur C2133: 'x': taille inconnue

J'ai même essayé le code dans cette page et il donne le même problème (je commentais le code qui donne l'erreur et décommenté le bon): http://msdn.microsoft.com/en-us/library/eff825eh%28VS.71%29.aspx

Si je tentais un compilateur merdique, Je pense que c'est un bug dans le compilateur, mais c'est VS2010!

+3

vérifiez que LEN n'a pas été # défini quelque part? – sje397

+0

Ma question est pourquoi n'utilisez-vous pas un '# define' pour cela? – William

+4

Compilez-vous C ou C++? –

Répondre

10

Vous avez peut-être compilé votre code à l'aide de l'extension .c. MS Visual C ne prend pas en charge C99. En C89, la taille d'un tableau doit être une expression constante. const les variables qualifiées ne sont pas constantes en C. Elles ne peuvent pas être utilisées aux endroits où une réelle constante est requise.

Lire également this excellent post par AndreyT.

Essayez d'enregistrer le fichier avec l'extension .cpp.

+0

Fonctionne pour moi en gcc, quel que soit le dialecte de C que je spécifie. Mais je pense que vous pourriez être sur quelque chose dans la mesure où peaufiner Visual Studio. –

+1

@Jon: gcc supporte C99 et les tableaux de longueur variable font partie de C99, donc le code fonctionne dans gcc. Le code est valide en C99 et C++. – Karthik

+0

@Jon Avec '-ansi', GCC donne' warning: ISO C90 interdit le tableau de taille variable 'x' –

2

Selon "http://msdn.microsoft.com/en-us/library/3ffb821x.aspx", les valeurs déclarées comme const qui sont initialisées avec des expressions constantes sont légales dans les limites de tableau, donc c'est un code C++ valide. Par conséquent, c'est soit un bogue du compilateur, soit quelque chose de bizarre venant d'un #define quelque part. Comme le suggère le commentaire de sje397, essayez un nom autre que LEN pour la longueur? Aussi, est-ce que c'est en fait votre code entier, ou est-ce que les en-têtes sont inclus aussi?

Modifier pour ajouter: Aussi, le fait qu'il s'agisse d'un code C++ valide n'a pas d'importance si vous le compilez en C, comme d'autres l'ont noté.

+0

Cela ressemble plus à une fonctionnalité non implémentée qu'à un bogue sérieux. J'ai eu le même problème en transférant mon code de G ++ à un autre compilateur, je ne me souviens pas lequel. –

+0

Je dirais qu'en C++ c'est un bug sérieux (c'est assez basique qu'une expression constante devrait en fait être une expression constante), tandis qu'en C99 le bogue serait une fonctionnalité non-implémentée de tableaux de longueur variable. Mais un point juste. –

1

car dans ce cas, je peux faire:

int main() 
{ 
    const int LEN = 5; 
    int* LENptr = (int*)(&LEN); 
    *LENptr = 10; 
    int x[LEN]; 
} 

qui const est le seul moyen en lecture seule dans ce code, pas de compilation constante

+3

Cet "exemple" présente un comportement indéfini, vous ne pouvez donc rien déduire du comportement de la langue. –

+0

Vous pouvez écrire ce code, et peut-être le compiler, mais est-ce que le fait de rejeter la constité de votre pointeur-cible signifie qu'il est légal de changer sa valeur? Je ne pense pas. Si j'ajoute 'printf ("% d \ n ", LEN);' à la fin de ce code, et le compile avec g ++ et l'exécute, il imprime 5, pas 10. Je suis presque surpris qu'il ne segfault pas . –

+0

J'ai juste essayé votre code (pour la science :), mais LEN n'a jamais changé. Donc, c'est peut-être comme Bailey a dit "comportement indéfini". – m4design

2

Vous pouvez également utiliser

int main() 
{ 
    enum { LEN = 5 }; 
    int x[LEN]; 
} 
+0

Cela fonctionne. Testé maintenant avec VS2015. Les extensions de langues sont également désactivées. La chose merdique est que Microsoft dans leur documentation utilise un exemple qui ne fonctionne pas https://msdn.microsoft.com/en-us/library/eff825eh(VS.71).aspx –

+0

@JohnLeidegren lol, c'est une honte. – TmsKtel

Questions connexes