Verständnis der C11-Typhierarchie

Lesezeit: 6 Minuten

Benutzer-Avatar
Krzysztof Abramowicz

Ich möchte die Typhierarchie der C11-Sprache vollständig verstehen und grafisch darstellen (ein Baumdiagramm wäre perfekt). Die Norm gibt dazu keine Zahlen vor – es gibt 30 Punkte, die einzelne Typen und Beziehungen zwischen ihnen beschreiben. Ich möchte es zeichnen.

Mein Versuch begann damit, die ISO/IEC 9899:201x Ausschussentwurf N1570 und Extrahieren aller wesentlichen Aussagen aus Abschnitt 6.2.5 des Dokuments. Dann fing ich an, das Wissen in Form eines Baumes neu zu ordnen. Lassen Sie mich meine Arbeit in zwei Schritten vorstellen.

Schritt 1: Punkte 1–15

Das extrahierte Wissen (Punkt in Abschnitt 6.2.5 + spezifizierte Produktion):

  • 1 Typen = Objekttypen + Funktionstypen;
  • 4 Standard-Integer-Typen mit Vorzeichen = signed char, short int, int, long int, long long int;
  • 4 vorzeichenbehaftete Integer-Typen = Standard-Ganzzahltypen mit Vorzeichen + erweiterte vorzeichenbehaftete Integer-Typen;
  • 6 Standard-Ganzzahltypen ohne Vorzeichen = _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int;
  • 6 vorzeichenlose Integer-Typen = Standard-Ganzzahltypen ohne Vorzeichen + erweiterte vorzeichenlose Integer-Typen;
  • 7 Standard-Integer-Typen = Standard-Ganzzahltypen mit Vorzeichen + Standard-Ganzzahltypen ohne Vorzeichen;
  • 7 erweiterte Integer-Typen = erweiterte vorzeichenbehaftete Integer-Typen + erweiterte vorzeichenlose Integer-Typen;
  • 10 echte Schwebetypen = float, double, long double;
  • 11 komplexe Typen = float _Complex, double _Complex, long double _Complex;
  • 12 schwimmende Typen = echte schwebende Typen + komplexe Typen;
  • 14 Grundtypen = char + vorzeichenbehaftete Integer-Typen + vorzeichenlose Integer-Typen + Floating-Typen;
  • fünfzehn Charaktertypen = char, signed char, unsigned char.

Und die resultierende Struktur:

types
    object types
    function types
basic types
    char
    sίgned integer types
        standard sίgned integer types
            signed char, short int, int, long int, long long int
        extended sίgned integer types
    unsίgned integer types
        standard unsίgned integer types
            _Bool, unsigned char, unsigned short int, unsigned int,
            unsigned long int, unsigned long long int
        extended unsίgned integer types
    floating types
        real floating types
            float, double, long double
        complex types
            float _Complex, double _Complex, long double _Complex
standard integer types
    standard sίgned integer types
    standard unsίgned integer types
extended integer types
    extended sίgned integer types
    extended unsίgned integer types
character types
    char, signed char, unsigned char

Schritt 2: Punkte 16–24

Die restlichen Aussagen:

  • 16 Aufgezählte Typen;
  • 17 Integer-Typen = char + Ganzzahltypen mit Vorzeichen + Ganzzahltypen ohne Vorzeichen + Aufzählungstypen;
  • 17 echte Typen = Integer-Typen + reelle Floating-Typen;
  • 18 arithmetische Typen = Integer-Typen + Floating-Typen;
  • 20 abgeleitete Typen = Array-Typen, Strukturtypen, Gewerkschaftstypen, Funktionsarten, Zeigertypen, atomare Typen;
  • 21 Skalare Typen = arithmetische Typen + Zeigertypen;
  • 21 Aggregattypen = Arraytypen + Strukturtypen;
  • 24 abgeleitete Deklaratortypen = Arraytypen + Funktionstypen + Zeigertypen.

Und die endgültige Systemstruktur vom Typ C11:

types
    object types
    function types
basic types
    char
    sίgned integer types
        standard sίgned integer types
            signed char, short int, int, long int, long long int
        extended sίgned integer types
    unsίgned integer types
        standard unsίgned integer types
            _Bool, unsigned char, unsigned short int, unsigned int,
            unsigned long int, unsigned long long int
        extended unsίgned integer types
    floating types
        real floating types
            float, double, long double
        complex types
            float _Complex, double _Complex, long double _Complex
standard integer types
    standard sίgned integer types
    standard unsίgned integer types
extended integer types
    extended sίgned integer types
    extended unsίgned integer types
character types
    char, signed char, unsigned char
real types
    integer types
        char
        sίgned integer types
            standard sίgned integer types
                signed char, short int, int, long int, long long int
            extended sίgned integer types
        unsίgned integer types
            standard unsίgned integer types
                _Bool, unsigned char, unsigned short int, unsigned int,
                unsigned long int, unsigned long long int
            extended unsίgned integer types
        enumeration  types
    real floating types
        float, double, long double
scalar types
    arithmetic types
        integer types
            char
            sίgned integer types
                standard sίgned integer types
                    signed char, short int, int, long int, long long int
                extended sίgned integer types
            unsίgned integer types
                standard unsίgned integer types
                    _Bool, unsigned char, unsigned short int, unsigned int,
                    unsigned long int, unsigned long long int
                extended unsίgned integer types
            enumeration  types
        floating types
            real floating types
                float, double, long double
            complex types
                float _Complex, double _Complex, long double _Complex
    pointer types
derived types
    array types
    structure types
    unίon types
    function types
    pointer types
    atomic types
aggregate types
    array type
    structure type
derived declarator types
    array type
    structure type
    pointer type

Jetzt muss ich die Struktur reduzieren (idealerweise auf einen einzelnen Baum) oder einen kniffligeren Weg finden, die Beziehungen darzustellen. Ich würde gerne ein schönes Cheet-Sheet für das C11-Schreibsystem herausbringen. Irgendwelche Ideen?

  • Die Grundtypen usw. sind alle Objekttypen. Sie scheinen sie nicht als Untertyp der Objekttypen zu behandeln. Sie haben auch eine Reihe von Typen, die an mehreren Stellen in Ihrem Diagramm erscheinen.

    – Jonathan Leffler

    8. Dezember 2013 um 1:47 Uhr


  • Ist wchar_t hier anwendbar? C11 3.7.3

    – chux – Wiedereinsetzung von Monica

    8. Dezember 2013 um 2:32 Uhr

  • @KrzysztofAbramowicz, du verfehlst meinen Standpunkt. Der Begriff “Ganzzahltyp” kommt danach als solcher vor, und das Weglassen von “Standard” von “Standard-Ganzzahltypen” kollidiert daher mit den Namen der beiden Begriffe. Der Begriff “Ganzzahltyp” an sich ist im Standard sehr wichtig, und sein Konzept wird hier noch nicht einmal dargestellt.

    – Jens Gustedt

    8. Dezember 2013 um 17:32 Uhr

  • Liebe Superuser und Moderatoren, die Frage ist furchtbar lang geworden – zu lang für dieses Format, aber sie ist nicht zu weit gefasst. Ich bin fast bereit, darauf eine Antwort zu geben – sie wird aus einem einzigen Diagramm und einem Textabsatz bestehen und den Abschnitt „Schritt 3“ der Frage ersetzen. Als Ergebnis: 1. wird die Frage viel kürzer, 2. sie wird beantwortet. Eröffnen Sie also bitte meine Frage erneut und geben Sie mir die Chance, diesen Thread zu vervollständigen – mindestens 10 Personen warten darauf.

    – Krzysztof Abramowicz

    11. Dezember 2013 um 22:31 Uhr

  • @KrzysztofAbramowicz, schönes Diagramm. Wie aus Ihrer Bemerkung über _Atomic, das ist nicht ganz richtig. Es kann in zwei verschiedenen Bedeutungen auftreten, die außerdem sehr nahe beieinander liegen: als Qualifier, und deshalb sollten Sie ihn mit den anderen Qualifiern auflisten, und als Typ Bezeichner. Das spätere ist das mit dem () und nur bei diesem wird der entsprechende Atomtyp als abgeleiteter Typ angesehen, so bizarr das klingen mag.

    – Jens Gustedt

    16. Dezember 2013 um 23:23 Uhr

Benutzer-Avatar
Krzysztof Abramowicz

Die unübersichtliche Struktur der C11-Typen, die sich aus dem zweiten Schritt der Frage ergibt, kann vereinfacht werden, indem weniger wichtige Knoten entfernt/reduziert und einige redundante/untergeordnete Informationen delegiert werden, die auf andere Weise dargestellt werden sollen.

Ich schlage dafür den folgenden fünfstufigen Algorithmus vor:

  1. Entfernung aller erweitert Integer-Typen (streng konforme Implementierung vorausgesetzt);
  2. Reduktion der Standard Integer-Typen (da sie keine Typen mehr partitionieren);
  3. Struktur gruppieren:
    1. EIN Skalare Typen vs Aggregattypen Paar von Teilbäumen (dargestellt als Baum),
    2. EIN Grundtypen vs abgeleitete Typen Paar von Teilbäumen (dargestellt durch farbige Regionen),
    3. echte Typen und abgeleitete Deklaratortypen (dargestellt als strichlierte Teilregionen davon),
    4. Charaktertypen (dargestellt mit unterschiedlicher Textfarbe);
  4. Anwendung einer Sonderanfertigung: Objekttypen = Skalare Typen + Aggregattypen;
  5. Ergänzung der Objekttypen des Vermissens Gewerkschaftstypen und atomare Typen.

Die resultierende Systemzusammenfassung vom Typ C11 sieht wie folgt aus:

C11-Typ-Hierarchie

Die grauen Striche/Flächen werden eingeführt, um die Lesbarkeit des Baums zu verbessern.

Die Typzusammenfassung enthält nicht das Konzept der “Vollständigkeit der Typdeklaration”, da es sich um einen Zustand handelt, der an einem bestimmten Punkt innerhalb einer beobachtet wird Übersetzungseinheit. Zur Laufzeit sind alle Objekte und Funktionen Instanzen von a kompletter Typ. Das void type ist eine Ausnahme, aber als no-type (oder any-type im Fall eines Zeigers) wird es absichtlich aus dem Diagramm ausgeschlossen.

Das const, volatile, restrict und _Atomic sind Art Qualifizierer was im Gegensatz zu Typbezeichner für die abgeleitete Typen, kann nicht rekursiv angewendet werden. Jede Kombination davon kann jeder Typdefinition vorangestellt werden (solange es sinnvoll ist). Daher würde ihre Aufnahme in das Diagramm es verkomplizieren, ohne dass geeignete Informationen eingeführt würden. Die offensichtliche Ausnahme macht die _Atomic (type) Konstrukt, das als a berücksichtigt wird Typbezeichner für die atomarer Typ – einer der abgeleitete Typen im C11-Standard aufgeführt.

1384220cookie-checkVerständnis der C11-Typhierarchie

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy