L’erreur VS2008 était une expression constante attendue lors de la déclaration d’un tableau, mais aucune erreur pour ce code dans GCC.

J’ai fonction suivante

void someFun(int* ar, const int size) { int newAr[size]; //do something } 

Et je reçois pour cette ligne trois erreurs:

 Error 1 error C2057: expected constant expression Error 2 error C2466: cannot allocate an array of constant size 0 Error 3 error C2133: 'newAr' : unknown size 

Mais la taille de la var est constante! Et en utilisant gcc cela est compilé sans erreur. Pouvez-vous me dire quoi et pourquoi est faux ici pour vs2008 (ou pour Visual C ++ en général peut-être)? Merci d’avance.

size n’est pas une expression constante. Le terme “expression constante” dans le message d’erreur fait référence au concept C ++ d’Expression Constante Intégrale. L’idée même de Integral Constant Expression est que sa valeur doit être connue au moment de la compilation. Par exemple, un object intégral intégré déclaré avec un initialiseur peut être utilisé comme expression constante intégrée.

Le fait que vous ayez déclaré une variable int const ne la convertit pas en une expression constante intégrale. Les parameters de fonction ne forment jamais d’expressions constantes intégrales. C’est pourquoi vous ne pouvez pas utiliser votre size pour définir la taille d’un tableau en C ++.

GCC comstack votre code car il apporte une fonctionnalité non spécifique du langage C au langage C ++ en tant qu’extension non standard. Notez que dans GCC, votre size n’est pas non plus considérée comme constante. GCC n’a simplement pas besoin que la taille des tableaux soit constante.

Si vous passez votre compilateur GCC en mode C ++ ssortingct et pédant, il refusera de comstackr votre code comme le fait MSVC ++.

La taille d’un tableau statique doit être connue au moment de la compilation (par conséquent, il ne peut s’agir d’une variable. Le mot clé const signifie que la variable ne peut pas être modifiée, mais ne signifie pas que la variable est constante sur toute la longueur du programme et qu’elle est moins connue à la compilation. temps). Vous devrez faire quelque chose comme ça:

 int* newAr = new int[size]; 

ou mieux encore utilisez un vecteur:

 std::vector(size); 

La raison pour laquelle je suggère que le vecteur sur alloue dynamicment un tableau est que, avec ce dernier, vous devez vous souvenir de désallouer la mémoire une fois que vous avez terminé, sinon vous allez la perdre. Avec le vecteur cependant, il gérera sa propre mémoire.

Vous pouvez obtenir des informations supplémentaires sur les vecteurs ici . Je suggère fortement que vous lisiez dessus, ils sont très utiles et sont dans mon cas le premier conteneur que je tends la plupart du temps.

PS: Comme chris l’a mentionné, c’est parce que gcc a la capacité de le faire depuis un moment que c’est une extension non standard et qu’il n’est donc pas portable. Heureusement, je pense que cela a été entré dans le brouillon standard C ++ 14, ce qui signifie que la plupart / tous les compilateurs le prendront en charge assez rapidement.

Le paramètre const int size ne signifie pas que size est constante à la compilation. Cela signifie simplement que dans someFun , vous ne pouvez pas modifier la valeur de la size . Cependant, la valeur de la size peut être modifiée entre différents appels de someFun .

Les tableaux en C / C ++ doivent avoir une taille connue au moment de la compilation.