Warum ist
%Vor% ist in C und C ++ unzulässig (weil T
nicht definiert ist), während
ist gültig, obwohl es T
noch nicht definiert? Gibt es eine Situation, in der es für den Aufrufer einen semantischen Unterschied macht, ob T
eine Struktur oder ein anderer Typ ist (Klasse / enum / typedef / etc.)?
In C, weil Zeiger auf Strukturen (jede Struktur) alle die gleichen Eigenschaften für Breite und Ausrichtung haben
6.2.5 / 27 ( C99 Standard )
Ein Zeiger auf die Leere muss dieselbe Darstellung haben und Ausrichtungsanforderungen als Zeiger auf einen Zeichentyp. Ebenso Zeiger auf qualifizierte oder unqualifizierte Versionen von kompatible Typen müssen die gleiche Darstellung und Ausrichtung Anforderungen. Alle Zeiger auf Strukturtypen soll die gleiche Darstellung und Ausrichtung haben Anforderungen wie einander. Alle Zeiger auf Union-Typen soll die gleiche Darstellung und Ausrichtung haben Anforderungen wie einander. Zeiger auf andere Arten brauchen haben nicht die gleichen Darstellungs- oder Ausrichtungsanforderungen.
Zeiger auf alles können andererseits unterschiedliche Eigenschaften für Breite und / oder Ausrichtung haben (void *, Funktionszeiger, unsigniertes Zeichen *, ...)
void foo(struct T*);
fungiert gleichzeitig als Forward-Deklaration von struct T
in diesem Bereich, daher ist es sicher, einen Zeiger darauf zu benennen.
In void foo(T*)
gibt es keine Angabe, was T
sein soll. Wenn es sich herausstellt, dass der Name einer Variablen und nicht ein Typ ist, dann ist die Codezeile schlecht gebildet. C ++ benötigt mehr Informationen, bevor es sagen kann, dass die Codezeile gültig ist.
fungiert als Vorwärtsdeklaration von T. Sie versprechen den Compiler, den Sie später definieren werden. Wenn Sie tatsächlich etwas auf T gemacht oder versucht haben, es zu instanziieren, hätten Sie Probleme:
%Vor%Nur
%Vor% ist ein beliebiger Bezeichner. Ist es eine Variable? Ist es eine Funktion? Die Sprache bietet keine Möglichkeit zum Weiterleiten von Deklarationen, ohne struct
oder class
vor der Variablen hinzuzufügen.
struct T
deklariert T
als struct
, selbst wenn es in einer größeren Deklaration erscheint, d. h. der Deklaration von foo
. Der Typ ist unvollständig, aber das spielt keine Rolle, wenn er zum Deklarieren eines Zeigerfunktionsparameters verwendet wird.
Ohne den struct
weiß der Compiler nichts darüber, was T
sein soll.
Wenn T
zuvor als struct
deklariert wurde, dann wäre void foo(T*)
in C ++ zulässig, aber nicht in C, da die Namen von struct
s nicht automatisch zu Typnamen werden, obwohl Sie eine% co_de deklarieren können % mit einem identischen Namen in C, wenn Sie möchten.