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
DDDoriginal
2024-12-18 10:16:10404parcourir

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'
  • 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!

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