2017-01-19 1 views
1

Warum ist die folgende Rechts:Warum sind Zeiger auf unvollständige Typen erlaubt und nicht auf unvollständige Typen?

typedef struct a aType; 
struct a 
{ 
    int x; 
    aType *b; 
}; 

und die folgende illegal:

void main() 
{ 
    typedef struct a aType; 
    aType someVariable; 
    struct a 
    { 
     int x; 
     aType *b; 
    }; 
} 

Ich bin nur neugierig, wie in jedem Fall nach vorne verweist und soweit ich weiß, zumindest für Funktionen und Variablen, Vorwärtsreferenzierung ist nicht zulässig.

Würde die Antwort auch für C++ die gleiche sein?

+4

In Fall 2 kennt der Compiler die Größe von 'aType' noch nicht - das erscheint, nachdem Sie versucht haben,' someVariable' zu ​​definieren. Sie könnten jedoch 'aType * somePointer;' legitimerweise - die Zeigergröße ist bekannt, selbst wenn die Größe dessen, was es zeigt, nicht ist. –

+1

Siehe [Was sollte 'main()' in C und C++ zurückgeben?] (Http://stackoverflow.com/questions/204476/) –

+1

Bitte verwenden Sie einen entsprechenden Titel. Es ist völlig unabhängig von dem, was Sie fragen. Und wenn Sie sich für verschiedene Sprachen interessieren, fragen Sie nach anderen Fragen. – Olaf

Antwort

3

Dieses es auf diese Art und Weise:

typedef struct a aType; 
struct a { int x; aType *b; }; 

ist die gleiche wie:

struct a; 
typedef struct a aType; 
struct a { int x; aType *b; }; 

Sie sind also voraus zur Vereinbarkeit eines struct, typedef es ing ist und es später. Perfekt in Ordnung.

nun das zweite Beispiel:

typedef struct a aType; 
aType someVariable; 
struct a { int x; aType *b; }; 

Das hat nichts mit der Tatsache zu tun, dass es in lokalem Bereich ist. Was passiert ist, ist dies:

struct a; 
typedef struct a aType; 
aType someVariable; // error: when it gets here, aType is still incomplete 
struct a { int x; aType *b; }; 
aType someVariable; // perfectly fine, aType not incomplete 

Denken Sie daran, dass Kompilation um passiert. Wenn Sie versuchen, someVariable zu deklarieren, weiß der Compiler nicht, was struct a ist noch, so dass es seine Größe nicht kennt, daher weiß es nicht, wie viel Speicher für es zuzuweisen, daher ein Kompilierungsfehler. Die Deklaration nach aType ist wie erwartet definiert.

3

Sie können Zeiger auf unvollständige Typen erstellen, da die Größe des Zeigerobjekts nicht von der Größe des angegebenen Typs abhängt. Zeiger auf verschiedene struct Typen haben die gleiche Größe und Darstellung, unabhängig von der Größe des struct Typs.

Sie dürfen keine Instanzen von unvollständigen Typen erstellen, da die Größe des Typs nicht bekannt ist.

+0

[Ihr Zitat] (http: // stackoverflow.com/questions/41751479/why-are-pointer-to-incomplete-types-allowed-and-not-variables-of-incomplete-type # comment70698059_41751479) ist ebenfalls nützlich. – chux

Verwandte Themen