2009-06-11 9 views
2

J'utilisais ma structure comme ceci. Je n'aime pas typedef comme je l'ai dit, il peut cacher des erreurs. Cependant, je regardais un exemple de code et j'ai vu des structures déclarées comme ça. Et c'est la façon normale de les déclarer.Différence dans la déclaration des structures

struct person 
{ 
    int age; 
    char name[32]; 
}; 

en utilisant comme ceci:

struct person person_a; 
    person_a.age = 20; 
    etc. 

Cependant, j'ai vu des structures déclarées comme ceci:

struct 
{ 
    int age; 
    char name[32]; 
}person; 

et

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

Quelle est la différence entre tous ces différentes techniques, et comment décideriez-vous quand il est préférable d'utiliser chacun d'entre eux?

Un grand merci pour toutes les suggestions,

+2

Je suis curieux de savoir pourquoi typedefs peut cacher des erreurs. J'ai tendance à préférer les typedefs, notamment parce que vous ne pouvez pas rencontrer de problèmes avec l'utilisation de 'extern void func (struct quelque chose * xxx);' sans une déclaration de 'struct something' à l'avance. Autrement dit, 'extern void func (quelque chose * xxx);' nécessite le typedef pour 'quelque chose' à compiler du tout. L'alternative compile - mais ne fait pas ce que vous attendez (bien que, dans l'ensemble, vous feriez avec elle). –

Répondre

17

: Ce

struct 
{ 
    int age; 
    char name[32]; 
}person; 

Déclare une person variable qui est un struct. Le struct n'a pas de nom, mais vous utilisez toujours la variable person de la même manière.

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

Ceci est identique à:

struct _person 
{ 
    int age; 
    char name[32]; 
}; 
struct _person person; 

Il déclare un struct nommé _person et fait alors une variable appelée person de type struct _person.

1

Il n'y a pas de magie là vraiment,

struct person 
{ 
    int age; 
    char name[32]; 
} var; 

est la même chose que:

struct person 
{ 
    int age; 
    char name[32]; 
}; 
struct person var; 
1

Le 1er code crée juste la struct personne.
Le 2ème code crée une instance de la structure de personne appelée person_a.
Le 3ème code crée une structure non nommée et une instance appelée person. Le 4e code crée une structure nommée _person et une instance de cette personne nommée.

1

Si le but de la définition de la structure est de déclarer une structure de données logique qui a une signification en dehors du module local, alors vous vous attendez à voir la première construction dans un fichier d'en-tête. Dans le monde réel, le code C, les structures sont souvent déclarées pour des raisons purement pragmatiques qui sont de portée locale. Par exemple, le formatage des données qui seront copiées dans un tampon. Dans ces cas, il est très pratique et logique de fusionner le type de structure et la déclaration de variable. En outre, l'utilisation d'une déclaration anoymous pour le type de structure évite d'encombrer l'espace de noms avec un nom qui n'est pas nécessaire. J'ai un critisim de ces exemples: en C, les noms avec un trait de soulignement principal sont considérés comme réservés pour les fournisseurs de compilateurs conventionnels. Je ne pense donc pas que le dernier exemple soit conforme aux meilleures pratiques.

2

Dans les deux dernières structures, vous avez alloué du stockage pour la structure appelée personne.

Ce que je veux dire est que si vous avez quelque chose comme ceci:

struct person 
{ 
    int age; 
    char name[32]; 
}; 

Il est juste une déclaration; Aucune allocation de variable n'est disponible et ne peut donc pas être utilisée dans le code. Vous pouvez commencer à utiliser cette structure après avoir déclaré comme suit:

struct person p1; 

Ensuite, p1 peut être utilisé p1.age ou p1.name, etc.

En termes de code dans le monde réel, au lieu de

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

que nous voyons habituellement

typedef struct _person 
{ 
    int age; 
    char name[32]; 
} person_t; 

Dans ce cas, nous pouvons diminuer la frappe et surtout les s La structure se comporte comme n'importe quel type intégré tel que int, etc. Par exemple,

personne_t p1;

personne_t * p1;

Et ainsi de suite.

2

Pour le premier cas (du deuxième exemple), vous utiliserez cette approche si vous êtes sûr que vous avez besoin d'un autre objet pour cette structure. Cela a l'air propre et rapide au code :)

Pour le second cas, vous avez un objet prêt nommé « personne » et une option pour créer un objet plus tard comme

struct _person object2 

Ceci est d'expliquer pourquoi vous utilisera l'une ou l'autre approche. La différence entre eux a été expliquée bien au-dessus.

Questions connexes