Maison >développement back-end >C++ >`int size = 10;` est-il une expression constante en C : un problème de compatibilité du compilateur ?

`int size = 10;` est-il une expression constante en C : un problème de compatibilité du compilateur ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-09 22:08:15874parcourir

Is `int size = 10;` a Constant Expression in C  : A Compiler Compatibility Issue?

Est-ce que "int size = 10;" Générer une expression constante ?

L'extrait de code ci-dessous se compile avec succès dans gcc 4.8 et Clang 3.2 :

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

Selon la norme C (8.3.4/1), le la taille d'un tableau doit être une expression constante intégrale. Cependant, il semble que la « taille » dans le code ne soit pas une expression constante intégrale. Est-ce un bug du compilateur ou un oubli dans notre compréhension ?

Visual Studio C rejette ce code avec le message : "erreur C2466 : impossible d'allouer un tableau de taille constante 0". Cela implique que le compilateur considère la « taille » comme étant nulle.

Explication

gcc et Clang prennent en charge les tableaux de longueur variable (VLA) en tant que extension en C. VLA est une fonctionnalité C99 qui permet de déterminer la taille d'un tableau au moment de l'exécution. Dans l'extrait de code, la « taille » est déterminée au moment de la compilation, mais ce n'est pas une constante littérale. Par conséquent, la « taille » est considérée comme un VLA dans gcc et Clang.

Visual Studio, en revanche, ne prend pas en charge VLA et adhère à la norme C. En conséquence, il rejette le code car la « taille » n'est pas une constante littérale.

Conformité à la norme

La norme C définit une expression constante intégrale comme une expression qui, une fois évaluée, aboutit à une valeur de type énumération intégrale ou sans portée. Dans ce cas, "size" est initialisé avec une valeur littérale (10), ce qui en fait une expression constante intégrale.

L'utilisation de l'indicateur "-pedantic" dans gcc et Clang générera un avertissement concernant les tableaux de longueur variable. dans l'extrait de code. L'utilisation de "-pedantic-errors" fera de l'avertissement une erreur.

Solution

Pour se conformer à la norme C, "size" peut être déclaré comme const ou constexpr entier :

const int size = 10;

ou

constexpr int size = 10;

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