2017-08-16 1 views
3

Alles, was ich in C11 Standard für unvollständige Typen gefunden habe, sind unvollständige Array-Typen.Gibt es einen unvollständigen Typ ohne Array?

Ich frage mich, ob es einen unvollständigen Typ nicht Array gibt.

+1

Struktur in Vorwärtsdeklaration –

+1

'void' ist ein unvollständiger Typ, der nicht vervollständigt werden kann. –

Antwort

2

Als Referenz abgeschlossen werden kann, was unvollständig ist, vollständigen?

an verschiedenen Punkten innerhalb einer Übersetzungseinheit kann ein Objekttyp unvollständige (fehlende ausreichende Informationen, um die Größe von Objekten dieses Typs zu bestimmen) oder vollständige (mit ausreichender Information). §6.2.5 C11 1


Neben potentiell struct, union, Arrays und immer void sind enum vorübergehend unvollständige daß ihre Größe ist unvollständig, bis die }

. .. Der Aufzählungstyp ist unvollständig bis unmittelbar nach der }, die die Liste der Enumerator-Deklarationen beendet und danach abgeschlossen. §6.7.2.2 C11 4

int main() { 
    enum ee1 { a1 = 0, b1 = sizeof(int), c1 }; 
    printf("%zu\n", sizeof(enum ee1)); // OK 

    // error: invalid application of 'sizeof' to incomplete type 'enum ee2' 
    //          v--------------v 
    enum ee2 { a2 = 0, b2 = sizeof(int), c2 = sizeof(enum ee2) }; // Bad 
    printf("%zu\n", sizeof(enum ee2)); // OK 
} 

Weitere

Alle Erklärungen der Struktur, Vereinigung oder Aufzählungstypen, die den gleichen Umfang haben und den gleichen Tag verwenden, erklären die gleiche Art. Unabhängig davon, ob ein Tag vorhanden ist oder welche anderen Deklarationen des Typs sich in derselben Übersetzungseinheit befinden, ist der Typ bis unmittelbar nach der schließenden Klammer der Liste, die den Inhalt definiert, unvollständig und schließt danach ab. §6.7.2.3 4

2

Ja, void ist auch ein unvollständiger Typ, der nie abgeschlossen werden kann.

Wie in anderen Antworten erwähnt, ist auch eine Deklaration einer Struktur oder einer Vereinigung unbekannten Inhalts (d. H. Eine Vorwärtsdeklaration) ebenfalls ein unvollständiger Typ. Denken Sie daran, dass dies zu einem vollständigen Typ wird, sobald es mit seinen Mitgliedern deklariert ist (definierender Inhalt).

hinzuzufügen, zitiert C11, Kapitel §6.2.5/P1

[...] An verschiedenen Stellen innerhalb einer Übersetzungseinheit kann ein Objekttyp unvollständig (fehlende ausreichende Informationen, um die Größe zu bestimmen von Objekten dieses Typs) oder abgeschlossen (mit ausreichenden Informationen).

P19,

Die void Typ umfasst einen leeren Satz von Werten; Es ist ein unvollständiger Objekttyp, der nicht abgeschlossen werden kann.

und, P22,

Eine Array Art von unbekannter Größe ist ein unvollständiger Typ. Für einen Bezeichner dieses Typs wird die Größe in einer späteren Deklaration (mit interner oder externer Verknüpfung) angegeben. Eine Struktur oder ein Unionstyp mit unbekanntem Inhalt (wie in (6.7.2.3) beschrieben, ist ein unvollständiger Typ. Er wird für alle Deklarationen dieses Typs vervollständigt, indem dieselbe Struktur oder Union-Variable mit ihrem definierenden Inhalt später im selben Gültigkeitsbereich deklariert wird .

2

eine Vorwärtsdeklaration eines oder structunion ohne ist eine letztere Definition seines Inhalts auch ein unvollständiger Typ

aus Abschnitt 6.2.5 des C standard.

Ein Array-Typ unbekannter Größe ist ein unvollständiger Typ. Für einen Bezeichner dieses Typs ist die Angabe der Größe in einer späteren Deklaration (mit interner oder externer Verknüpfung) abgeschlossen. Eine Struktur oder union Typ von unbekanntem Inhalt (wie in 6.7.2.3 beschrieben) ist ein unvollständiger Typ. Für alle Deklarationen dieses Typs wird abgeschlossen, indem dieselbe Struktur oder Union-Variable mit ihrem definierenden Inhalt später im selben Umfang deklariert wird.

5

Ein unvollständiger Typ ist ein Typ, der einen Bezeichner beschreibt, aber keine Informationen enthält, die zur Bestimmung der Größe des Bezeichners benötigt werden. Ein „unvollständigen Typ“ kann

  • Ein Strukturtyp, deren Mitglieder Sie werden noch nicht festgelegt.

  • Ein Union-Typ, dessen Mitglieder Sie noch nicht angegeben haben.

  • Ein Array-Typ, dessen Dimension Sie noch nicht festgelegt haben.

Der Hohlraumtyp ist einen unvollständigen Typ, der nicht

Verwandte Themen