Ist “typedef” zwischen Typ und Alias ​​standardkonform?

Lesezeit: 5 Minuten

Benutzeravatar von Claas Bontus
Claas Bontus

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?

  • @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

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 staticerscheinen 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.

Benutzeravatar von John Bode
Johannes Bode

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, charusw.), ein Typqualifizierer (const, restrict, volatileusw.), 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 xoder int short const static xusw. 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 intetc.

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 xzum 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.

  • Ja – aber die C-Standard 6.11.5 (Zukünftige Sprachrichtungen) sagt: “Die Platzierung eines anderen Speicherklassen-Bezeichners als am Anfang des Deklarations-Bezeichners in einer Deklaration ist ein veraltetes Merkmal.”, so dass ein zukünftiger C-Standard dies zumindest im Prinzip nicht zulassen könnte int typedef INT;. Fühlen Sie sich frei, dies zu Ihrer Antwort hinzuzufügen.

    – Keith Thompson

    5. Februar 2016 um 19:20 Uhr


  • @KeithThompson: Fertig.

    – Johannes Bode

    5. Februar 2016 um 20:17 Uhr

Benutzeravatar von Mark B
Markus B

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

1407790cookie-checkIst “typedef” zwischen Typ und Alias ​​standardkonform?

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

Privacy policy