2010-09-22 3 views
9

L'équivalent suivant est-il en C?struct et typedef

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

typedef struct myStruct Foo; 

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

Sinon, lequel dois-je utiliser et quand?

(Oui, j'ai vu this et this.)

+1

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

+0

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

Répondre

9

Non, ils ne sont pas exactement équivalents. Dans la première version Foo est un typedef pour le struct myStruct nommé Dans la deuxième version, Foo est typedef pour un struct non nommé.

Bien que les deux Foo peuvent être utilisés de la même manière dans de nombreux cas, il existe des différences importantes. En particulier, la deuxième version ne permet pas l'utilisation d'une déclaration avant de déclarer Foo et la struct est un typedef pour alors que la première serait.

+0

Désolé, c'était une faute de frappe. Je voulais dire 'typedef struct myStruct foo' – Aillyn

+0

@pessimopoppotamus: Fixe –

+0

Merci, pouvez-vous montrer un exemple où la différence entre eux est apparente? – Aillyn

12

La deuxième option ne peut se référencer. Par exemple:

// 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

La première forme vous permet de faire référence à la struct avant la définition de type est terminée, vous pouvez donc se référer à la struct en lui-même ou avoir des types mutuellement dépendants:

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

typedef struct node Tree; 

ou

struct A; 
struct B; 

struct A { 
    struct B *b; 
}; 

struct B { 
    struct A *a; 
}; 

typedef struct A AType; 
typedef struct B Btype; 

Vous pouvez combiner les deux comme ceci:

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; 
};