Maison >développement back-end >C++ >Pourquoi certains compilateurs autorisent-ils les tableaux de longueur variable en C alors que d'autres ne le font pas ?

Pourquoi certains compilateurs autorisent-ils les tableaux de longueur variable en C alors que d'autres ne le font pas ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-17 11:05:261007parcourir

Why Do Some Compilers Allow Variable Length Arrays in C   While Others Don't?

Tableaux de longueur variable et expressions constantes

Le fragment de code C présenté ci-dessous a le potentiel d'être compilé avec succès avec certains compilateurs :

int main()
{
  int size = 10;
  int arr[size];
}

Selon la norme C (8.3.4/1), ce code devrait être rejeté car la taille du tableau (arr) doit être une expression constante. Cependant, cela soulève des questions sur le comportement des compilateurs comme gcc 4.8 et Clang 3.2.

Les tableaux de longueur variable (VLA) entrent en jeu dans ce scénario. Les VLA sont une fonctionnalité C99 que gcc et clang ont implémentée en tant qu'extension dans C . Cependant, Visual Studio adhère strictement à la norme dans ce cas. Le message qu'il génère :

error C2466: cannot allocate an array of constant size 0

indique qu'il interprète à juste titre la taille comme zéro, ce qui n'est pas autorisé dans ce contexte.

Si vous activez l'indicateur -pedantic dans gcc et clang , vous recevrez des avertissements concernant l'utilisation des VLA. Par exemple, gcc déclare :

warning: ISO C++ forbids variable length array 'arr' [-Wvla]
  int arr[size];
              ^

De plus, l'utilisation de l'indicateur -pedantic-errors rendra cette utilisation une erreur. Reportez-vous à la documentation fournie pour plus d'informations sur les normes de langage prises en charge.

Le projet de norme C définit une expression constante intégrale dans 5.19 (Expressions constantes) comme suit :

"Une expression constante intégrale est une expression de type énumération intégrale ou sans portée, implicitement convertie en prvalue, où l'expression convertie est une expression constante de base. "

Pour assurer la conformité à la norme, vous peut initialiser size avec un littéral en utilisant const (ou constexpr). Cela ferait de size une expression constante intégrale :

const int size = 10;
// or
constexpr int size = 10;

La section correspondante du projet de norme C99 (6.7.5.2) précise que si la taille n'est pas présente, un type de tableau incomplet est déclaré. Si la taille est *, un type de tableau de longueur variable est créé sans longueur définie et ne peut être utilisé que dans certains contextes. Sinon, il s'agit soit d'un type de tableau régulier, soit d'un type de tableau de longueur variable basé sur les propriétés de l'expression.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn