Ich bin auf einen Code gestoßen, in dem die typedef
Das Schlüsselwort steht zwischen dem Typ und dem Aliasnamen wie in
int typedef INT;
Es kompiliert in gcc und clang (Live-Beispiel). Ich verstehe Standardesisch nicht sehr gut. Meine Frage ist also: Ist dieser Standard konform? Kann ich mich darauf verlassen, dass Compiler es unterstützen?
Das typedef
Das Schlüsselwort wird in C als Speicherklassenbezeichner klassifiziert, obwohl der Standard ausdrücklich darauf hinweist, dass dies der Einfachheit halber zum Ausdrücken der formalen Sprachsyntax dient. Daraus folgt jedoch typedef
kann an genau denselben Stellen erscheinen wie jeder andere Speicherklassenbezeichner, z extern
oder static
erscheinen kann. [C2011, 6.7.1/5]
Tatsächlich erlaubt die Syntax, Speicherklassenbezeichner mit Typbezeichnern, Typbezeichnern und anderen “Deklarationsbezeichnern” in Deklarationen zu vermischen. [C2011, 6.7/1, 6.7/6]
Also, ja, es ist gültig, die zu setzen typedef
Schlüsselwort nach dem Typnamen, wie in Ihrem Beispiel.
TL/DR-Version
Ja, int typedef INT
ist konform.
James Michener-Version
C-Deklarationssyntax (C 2011 Online-Entwurf):
6.7 Erklärungen
Syntax
1 declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
alignment-specifier declaration-specifiersopt
…
Dies besagt, dass Sie in einer einzelnen Deklaration eine oder mehrere Sequenzen haben können Deklarationsbezeichnerwobei jeder Deklarationsbezeichner ein Speicherklassenbezeichner sein kann (auto
, extern
, static
, typedef
), ein Typbezeichner (int
, float
, char
usw.), ein Typqualifizierer (const
, restrict
, volatile
usw.), ein Funktionsbezeichner (inline
) oder ein Ausrichtungsbezeichner.
Die Reihenfolge, in der verschiedene Spezifizierer erscheinen, spielt keine Rolle; static const short int x;
kann geschrieben werden als int static short const x
oder int short const static x
usw. Aus praktischen Gründen setzen die meisten Leute den Speicherklassenbezeichner zuerst, dann alle Funktions- oder Ausrichtungsbezeichner (falls erforderlich), dann alle Typqualifizierer, dann Typbezeichner, also static const short int x
ich zeige die meisten Menschen würden diese Erklärung schreiben.
Diese Syntax ermöglicht es uns, Typen wie zu schreiben long double
oder long long
oder unsigned long int
etc.
Beachten Sie, dass während der Syntax willkürliche (und willkürlich lange) Folgen von Typbezeichnern erlaubt, gibt es eine semantische Regel, die nur relativ wenige erlaubt. Du kannst nicht schreiben short short short short x
zum Beispiel, oder long long long double y
. Nur die folgenden Sequenzen sind erlaubt:
Einschränkungen
2 Mindestens ein Typbezeichner muss in den Deklarationsbezeichnern in jeder Deklaration und in der Bezeichner-Qualifizierer-Liste in jeder Struct-Deklaration und jedem Typnamen angegeben werden. Jede Liste von Typbezeichnern muss eines der folgenden Multisets sein (durch Kommas getrennt, wenn es mehr als ein Multiset pro Element gibt); die Typbezeichner können in beliebiger Reihenfolge auftreten, möglicherweise vermischt mit den anderen Deklarationsbezeichnern.
— void
— char
— signed char
— unsigned char
— short, signed short, short int, or signed short int
— unsigned short, or unsigned short int
— int, signed, or signed int
— unsigned, or unsigned int
— long, signed long, long int, or signed long int
— unsigned long, or unsigned long int
— long long, signed long long, long long int, or
signed long long int
— unsigned long long, or unsigned long long int
— float
— double
— long double
— _Bool
— float _Complex
— double _Complex
— long double _Complex
— atomarer Typbezeichner
— Struct- oder Union-Spezifizierer
— Aufzählungsbezeichner
— Typedef-Name
Nachtrag
Wie Keith im Kommentar unten anmerkt, kann eine zukünftige Überarbeitung der Sprache Speicherklassenbezeichner auf den Anfang der Deklaration beschränken, also int typedef INT
kann unter einem zukünftigen Compiler nicht legal sein.
Wenn Sie sich 7.1/1 ansehen, sehen Sie diese Grammatik für decl-specifier:
was zeigt, dass a type-specifier
und die typedef
Schlüsselwörter fallen an denselben Punkt in der Grammatik, sodass Sie sie wie in der Frage austauschen können (obwohl Sie nebenbei niemals solchen Code schreiben, es ist überhaupt nicht idiomatisch).
decl-Spezifizierer:
storage-class-specifier
type-specifier
function-specifier
friend
typedef
Ich kompiliere mit:
gcc -c -Wall -Wextra -pedantic -Wconversion -std=gnu99
Im Hintergrund bedeutet dies -Wold-style-declaration
eingestellt ist.
Dann gibt der Compiler folgende Warnmeldung aus:
warning: 'typedef' is not a beginning of declaration [-Wold-style-declaration]
ohne dass dieser Parameter gesetzt ist, verarbeitet der Compiler die Syntax ohne Probleme
Die gepostete Syntax entspricht also dem Standard, kann aber für den Leser verwirrend sein.
typedef int INT
RightWay, um typedef zu verwenden
Überall dort, wo Sie INT verwenden, wird es durch den Datentyp int ersetzt
Dieser Hauptzweck besteht darin, nur für lange Datenzeichenfolgen einen einfachen Wert zu erhalten, aber in diesem Fall können Sie normales int selbst verwenden
Sie können sich nur zu Testzwecken auf das Debugging verlassen, das Sie sehr gut verstehen können
@DanielA.White: Die C- oder C++-Standards sind nicht gerade für ihre gute Lesbarkeit bekannt.
– Nicol Bolas
5. Februar 2016 um 16:23 Uhr
@DanielA.White Der Standard ist es nicht gemeint lesbar sein. So soll es sein präzise.
– BoBTFisch
5. Februar 2016 um 16:26 Uhr
@JameyD Das hilft nicht wirklich. Die Schwierigkeit ist drin Dolmetschen Dieser Text.
– BoBTFisch
5. Februar 2016 um 16:26 Uhr
@DanielA.White Ich verstehe immer noch nicht. Die Frage ist eindeutig, ob dies standardkonform ist oder nicht, nicht, ob es mehr oder weniger lesbar ist als eine andere Form (die wahrscheinlich sowieso nicht zum Thema gehört).
– BoBTFisch
5. Februar 2016 um 16:28 Uhr
Englisch ist nicht die genaueste Sprache und wir sehen das hier zweimal versagen. Es ist schwer, den darin geschriebenen Standard zu interpretieren UND es ist schwer, die Verwendung des Wortes Standard in Kommentaren zu interpretieren, die den Standard diskutieren. Man konnte fast die Monty-Python-Skizze oder das Geplänkel von Abbot und Costello sehen.
– Benutzer4581301
5. Februar 2016 um 16:32 Uhr