Warum Pointer auf nicht definierte Structs sind in C und C ++ manchmal illegal

8

Warum ist

%Vor%

ist in C und C ++ unzulässig (weil T nicht definiert ist), während

%Vor%

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.)?

    
Mehrdad 03.05.2011, 21:48
quelle

4 Antworten

6

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 *, ...)

    
pmg 03.05.2011, 21:59
quelle
5

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.

    
quelle
2
%Vor%

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.

    
Doug T. 03.05.2011 21:50
quelle
1

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.

    
Charles Bailey 03.05.2011 21:51
quelle

Tags und Links