C-Deklaratoren erklären

Bindung von Zeigern, Arrays, Funktionen und Qualifizierern in einer unterstützten C11/C17-Deklaration nachvollziehen.

About this tool

Eine Deklaration eingeben und Erklären wählen. Zeilenumbrüche innerhalb der Deklaration sind erlaubt; das abschließende Semikolon ist optional. Beispiele füllen nur die Eingabe. Die nummerierten Schritte führen vom deklarierten Namen nach außen bis zum Basistyp. Unter Tokens stehen die einzelnen Eingabetokens. Änderungen entfernen die vorherige Erklärung.

Ohne gruppierende Klammern binden Array- und Funktionssuffixe vor den Zeigerpräfixen. Deshalb deklariert int *a[3]; ein Array aus drei Zeigern auf int, während int (*a)[3]; einen Zeiger auf ein Array aus drei int deklariert. int *(*fp)(void); deklariert einen Zeiger auf eine parameterlose Funktion, die einen Zeiger auf int zurückgibt.

Die unterstützte Teilmenge folgt C11/C17: eingebaute Basistypen mit gültigen Kombinationen aus signed, unsigned, short und long; const und volatile am Basistyp oder an einzelnen Zeigern; verschachtelte Klammern; positive dezimale Arraygrößen ohne führende Null; Funktionsdeklaratoren. Parameter dürfen einen Basistyp, Zeiger und einen optionalen Namen enthalten. Bezeichner verwenden ASCII-Buchstaben, Ziffern und Unterstriche und dürfen nicht mit einer Ziffer beginnen. Kommentare und Präprozessoranweisungen gehören nicht zur Teilmenge. Qualifizierer gehören zu ihrer jeweiligen Typstufe: const int *p; zeigt auf const int; bei int *const p; ist der Zeiger selbst const-qualifiziert.

Unter C11/C17 lässt f() Anzahl und Typen der Parameter offen. f(void) legt ausdrücklich keine Parameter fest. Das Tool verwendet nicht die C23-Bedeutung leerer Klammern. Arrays dürfen keine Funktionen oder unvollständigen Elementtypen enthalten; Funktionen dürfen nicht unmittelbar Arrays oder Funktionen zurückgeben. Ein Zeiger kann diese Typen verbinden, etwa bei einer Funktion, die einen Zeiger auf ein Array zurückgibt.

Nicht unterstützt werden Typedef-Namen, Strukturen, Unions, Enums, Initialisierer, mehrere Deklarationen, Speicherklassenspezifizierer, Attribute, _Atomic, restrict, variable Argumentlisten, Array- oder Funktionsparameter, Arrays variabler Länge und Ausdrücke als Arraygröße. Nicht unterstützte Syntax ist nicht automatisch in jedem C-Programm ungültig. Das Tool erklärt Deklaratoren; es ist kein Compiler und prüft keine vollständige Übersetzungseinheit.

Eingabegrenzen: 8192 Zeichen, 512 Tokens, Verschachtelungstiefe 64, 64 abgeleitete Typstufen, 64 Parameter, Bezeichner mit höchstens 128 Zeichen und Arraygrößen mit höchstens 20 Ziffern. Arrays werden symbolisch beschrieben; es wird weder Speicher angelegt noch eine Größe in Bytes berechnet.

Quellen: WG14 N1570, C11-Entwurf, Abschnitte 6.7.2, 6.7.3 und 6.7.6; WG14 N3096, C23-Entwurf, Abschnitt 6.7.6.3 zur geänderten Bedeutung von ().