Maison > développement back-end > C++ > Pourquoi certains codes C ne parviennent-ils pas à se compiler en C ?

Pourquoi certains codes C ne parviennent-ils pas à se compiler en C ?

DDD
Libérer: 2024-12-18 10:16:10
original
403 Les gens l'ont consulté

Why Does Some C Code Fail to Compile in 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'
    Copier après la connexion
  • 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[]'
    Copier après la connexion
  • 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
    Copier après la connexion
  • 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
    Copier après la connexion
  • 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
    Copier après la connexion

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
    Copier après la connexion
  • 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
    Copier après la connexion
  • 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
    Copier après la connexion
  • 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
    Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal