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