2010-09-22 11 views
9

Sind die folgenden Entsprechung in C?struct und typedef

// #1 
struct myStruct { 
    int id; 
    char value; 
}; 

typedef struct myStruct Foo; 

// #2 
typedef struct { 
    int id; 
    char value; 
} Foo; 

Wenn nicht, welchen sollte ich verwenden und wann?

(Ja, ich habe this und this gesehen.)

+1

http://stackoverflow.com/questions/1083959/purpose-of-stru ct-typedef-struct-in-c – karlphillip

+0

http://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c – karlphillip

Antwort

9

Nein, sie sind nicht genau gleichwertig.

In der ersten Version Foo ist eine Typedef für die genannten struct myStruct.

In der zweiten Version ist Foo ein typedef für einen unbenannten struct.

Obwohl beide Foo auf die gleiche Weise in vielen Fällen verwendet werden können, gibt es wichtige Unterschiede. Insbesondere erlaubt die zweite Version nicht die Verwendung einer Forward-Deklaration, um Foo zu deklarieren und die struct es ist eine typedef für, während die erste würde.

+0

Sorry, das war ein Tippfehler. Ich wollte sagen 'typedef struct myStruct Foo' – Aillyn

+0

@pessimopoppotamus: Fixed –

+0

Danke, können Sie ein Beispiel zeigen, wo der Unterschied zwischen ihnen offensichtlich ist? – Aillyn

12

Die zweite Option kann sich nicht verweisen. Zum Beispiel:

// Works: 
struct LinkedListNode_ { 
    void *value; 
    struct LinkedListNode_ *next; 
}; 

// Does not work: 
typedef struct { 
    void *value; 
    LinkedListNode *next; 
} LinkedListNode; 

// Also Works: 
typedef struct LinkedListNode_ { 
    void *value; 
    struct LinkedListNode_ *next; 
} LinkedListNode; 
3

Die erste Form ermöglicht es Ihnen, auf die Struktur zu beziehen, bevor die Typdefinition abgeschlossen ist, so kann man auf die Struktur in sich selbst beziehen oder sich voneinander abhängige Typen:

struct node { 
    int value; 
    struct node *left; 
    struct node *right; 
}; 

typedef struct node Tree; 

oder

struct A; 
struct B; 

struct A { 
    struct B *b; 
}; 

struct B { 
    struct A *a; 
}; 

typedef struct A AType; 
typedef struct B Btype; 

Sie können die beiden wie so kombinieren:

typedef struct node { 
    int value; 
    struct node *left; 
    struct node *right; 
} Tree; 

typedef struct A AType; // You can create a typedef 
typedef struct B BType; // for an incomplete type 

struct A { 
    BType *b; 
}; 

struct B { 
    AType *a; 
};