Heim >Backend-Entwicklung >C++ >Warum kann mancher C-Code nicht in C kompiliert werden?

Warum kann mancher C-Code nicht in C kompiliert werden?

DDD
DDDOriginal
2024-12-18 10:16:10459Durchsuche

Why Does Some C Code Fail to Compile in C  ?

C als Teilmenge von C: Erklärte Ausnahmen

Während oft behauptet wird, dass C eine Teilmenge von C ist, gibt es bestimmte Fälle, in denen dies der Fall ist Code kann in C nahtlos kompiliert werden, schlägt jedoch in C fehl.

Fälle, in denen Code fehlschlägt in C

  • Vorläufige Definitionen:
    C erlaubt mehrere Deklarationen desselben Variablennamens, C verbietet dies jedoch mit dem Fehler „n bereits definiert“. ."

    int n;
    int n; // error: redeclaration of 'n'
  • Inkompatibles Array Typen:
    C ermöglicht die Zuweisung von Arrays zu Zeigern mit unterschiedlichen Typen (z. B. int[1] zu int *()), während C solche Konvertierungen nicht zulässt.

    int a[1];
    int (*ap)[] = &a; // error: 'a' does not have type 'int[]'
  • K&R-Funktionsdefinitionsstil:
    C erlaubt Funktionsdefinitionen mit der Syntax int b(a) int A; { }, aber C hält es für einen Grammatikfehler.

    int b(a) int a; { } // error: grammar error
  • Verschachtelter Strukturbereich:
    C ermöglicht die Deklaration verschachtelter Strukturen mit Klassenbereich, aber C behandelt sie als lokale Variablen stattdessen.

    struct A { struct B { int a; } b; int c; };
    struct B b; // error: 'b' has incomplete type
  • Standarddeklarationen:
    C ermöglicht die Deklaration von Variablen ohne Angabe ihres Typs (z. B. auto a;), aber C erfordert eine explizite Typbezeichner.

    auto a; // error: type-specifier missing

Zusätzliche Ausnahmen in C99

  • Array-Dimensionen in Parametern:
    C99 verbietet Spezifizierer wie static in Array-Dimensionen von Funktionsparametern.

    void f(int p[static 100]) { } // error: invalid syntax
  • Variable Länge Arrays:
    C99 unterstützt keine Arrays variabler Länge (VLAs), bei denen Array-Größen zur Laufzeit berechnet werden.

    int n = 1;
    int an[n]; // error: 'n' is not a constant expression
  • Flexible Array-Mitglieder:
    In C99 fehlen flexible Array-Mitglieder (FAMs), die Datenelemente variabler Größe enthalten können Strukturen.

    struct A { int a; int fam[]; }; 
    // error: 'fam' has incomplete type
  • Restrict Qualifier:
    C99 ermöglicht dem Restrict Qualifier, Nicht-Aliasing des Speichers anzugeben, was C nicht unterstützt.

    void copy(int *restrict src, int *restrict dst); // error: two names for one parameter

Das obige ist der detaillierte Inhalt vonWarum kann mancher C-Code nicht in C kompiliert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn