Maison >développement back-end >C++ >Pourquoi certains codes C ne parviennent-ils pas à se compiler en C ?
C en tant que sous-ensemble de C : explication des exceptions
Bien qu'il soit souvent indiqué que C est un sous-ensemble de C, il existe certains cas où le code peut se compiler de manière transparente en C mais échouer en C.
Cas où le code échoue en C
Définitions provisoires :
C autorise plusieurs déclarations du même nom de variable, mais C l'interdit avec l'erreur "n déjà défini".
int n; int n; // error: redeclaration of 'n'
Tableau incompatible Types :
C permet d'attribuer des tableaux à des pointeurs de types différents (par exemple, int[1] en int *()), tandis que C interdit de telles conversions.
int a[1]; int (*ap)[] = &a; // error: 'a' does not have type 'int[]'
Style de définition de fonction K&R :
C permet les définitions de fonctions en utilisant la syntaxe int b(a) int un; { }, mais C considère cela comme une erreur de grammaire.
int b(a) int a; { } // error: grammar error
Nested Struct Scope :
C permet de déclarer des structures imbriquées avec une portée de classe, mais C les traite comme des variables locales à la place.
struct A { struct B { int a; } b; int c; }; struct B b; // error: 'b' has incomplete type
Déclarations par défaut :
C permet de déclarer des variables sans spécifier leur type (par exemple, auto a;), mais C nécessite un explicite spécificateur de type.
auto a; // error: type-specifier missing
Exceptions supplémentaires en C99
Dimensions du tableau dans les paramètres :
C99 interdit les spécificateurs tels que statiques dans les dimensions du tableau des paramètres de fonction.
void f(int p[static 100]) { } // error: invalid syntax
Longueur variable Tableaux :
C99 ne prend pas en charge les tableaux de longueur variable (VLA) dans lesquels les tailles de tableau sont calculées au moment de l'exécution.
int n = 1; int an[n]; // error: 'n' is not a constant expression
Membres de tableau flexibles :
C99 ne dispose pas de membres de tableau flexibles (FAM) pouvant contenir des membres de données de taille variable. structs.
struct A { int a; int fam[]; }; // error: 'fam' has incomplete type
Qualificateur de restriction :
C99 permet au qualificatif de restriction de spécifier le non-aliasing de la mémoire, ce que C ne prend pas en charge.
void copy(int *restrict src, int *restrict dst); // error: two names for one parameter
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!