2016-12-05 5 views
1

Quelqu'un peut-il me expliquer quelle est la différence entre ceci:typedef clarification struct

typedef struct{ 
char a[10]; 
int b; 
char c[8]; 
... 
}test; 

et ceci:

typedef struct test{ 
char a[10]; 
int b; 
char c[8]; 
... 
}test; 

Merci

+4

double possible de (http [C Typedef et struct Question]://stackoverflow.com/questions/1110944/c-typedef-and-struct-question) – LPs

Répondre

5
typedef struct{ 
char a[10]; 
int b; 
char c[8]; 
... 
}test; 

Le ci-dessus définit un anonyme struct et immédiatement typedef s au type alias test.

typedef struct test{ 
char a[10]; 
int b; 
char c[8]; 
... 
}test; 

Ceci, cependant, crée une structure nommée struct test ainsi que l'ajout d'un typedef pour elle.

Dans le premier cas, vous ne serez pas en mesure de transmettre le déclarer struct si vous avez besoin.
Il y a aussi un philosophy (que je suis d'accord avec un certain point), que toutes les structures typedef ing par défaut rend le code moins lisible et doit être évitée.

0

Avec la première version, vous ne pouvez déclarer:

test t; 

Avec la deuxième versijon vous pouvez choisir entre:

struct test t; 
test t; 
-3

Réponse courte: Ils sont les mêmes (dans votre code

Réponse longue: Pourquoi mettre test entre typedef struct et {? Est-ce inutile?

Ce (nom struct test) est inutile dans votre code

Dans ce code cependant, ce n'est pas:

struct Node { 
    int data; 
    struct Node * next; 
} head; 
+0

Il existe des différences et ces derniers ne sont pas valides. – Olaf

+0

@Olaf Oh, mon mauvais, j'ai raté 'struct' – DMaster

+2

Ils ne sont toujours pas la même chose! – Olaf

3

Avoir "test" en deux endroits différents est un peu déroutant. Je l'habitude d'écrire du code comme ceci:

typedef struct test_s { 
    ... 
} test; 

Maintenant, je peux soit le type d'utilisation struct test_s ou tout simplement test. Alors que test seul est généralement suffisant (et vous n'avez pas besoin test_s dans ce cas), vous ne pouvez pas en avant-déclariez pointeur vers elle:

// test *pointer; // this won't work 
struct test_s *pointer; // works fine 

typedef struct test_s { 
    ... 
} test; 
+0

Les noms se terminant par «_t» sont réservés par la norme. Vous pourriez vouloir faire juste 'typedef struct test_s {...} test_s;'. Je ne pense pas qu'il y ait beaucoup de valeur à avoir le nom typedefed différent de la balise struct. – PSkocik

+0

Bon à savoir. N'utilisera pas '_t' à partir de maintenant. La différence est juste pour la clarté. – aragaer