2010-09-22 17 views
9

¿Están los siguientes equivalentes en C?struct y typedef

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

typedef struct myStruct Foo; 

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

Si no, ¿cuál debo usar y cuándo?

(Sí, he visto this y this.)

+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

Respuesta

9

No, no son exactamente equivalentes.

En la primera versión Foo es un typedef para el nombre struct myStruct.

En la segunda versión, Foo es un typedef para un struct sin nombre.

Aunque ambos Foo se pueden usar de la misma manera, en muchos casos existen diferencias importantes. En particular, la segunda versión no permite el uso de una declaración directa para declarar Foo y la struct es typedef mientras que la primera lo haría.

+0

Disculpa, fue un error tipográfico. Quise decir 'typedef struct myStruct Foo' – Aillyn

+0

@pessimopoppotamus: Corregido –

+0

Gracias, ¿pueden mostrar un ejemplo donde la diferencia entre ellos es evidente? – Aillyn

12

La segunda opción no puede hacer referencia a sí mismo. Por ejemplo:

// 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 primera forma permite hacer referencia a la estructura antes de la definición de tipo se ha completado, por lo que puede referirse a la estructura en sí misma o tienen tipos mutuamente dependientes:

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

typedef struct node Tree; 

o

struct A; 
struct B; 

struct A { 
    struct B *b; 
}; 

struct B { 
    struct A *a; 
}; 

typedef struct A AType; 
typedef struct B Btype; 

Se pueden combinar los dos, así:

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