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!