En supposant que vous vouliez dire:
typedef struct someobj
{
/* ... */
} someobj_t;
la différence en général est juste stylistique; certaines personnes préfèrent s'en tenir au style "ancien C" pour les structures (où vous devez mettre le mot-clé struct
à chaque fois que vous faites référence à ce type), d'autres aiment la façon plus synthétique d'utiliser someobj_t
.
Beaucoup de gens qui utilisent le symbole défini par le typedef
le trouvent plus naturel car souvent ils viennent d'autres langages (par exemple C++, C#, ...) où il n'y a pas besoin de la chose struct
. Dans de nombreux cas, ils omettent même le nom struct
de la déclaration et laissent simplement le nom typedef
.
L'utilisation de ces deux symboles est en général équivalente, mais il y a quelques mises en garde; tout d'abord, avant la fin de la typedef
la version _t
n'existe pas, donc vous ne pouvez pas déclarer des pointeurs à la structure à l'intérieur de lui-même en utilisant le nom _t
.
Ensuite, le typedef
"n'existe" que pendant la compilation; Cela signifie que le compilateur et le débogueur se référeront à votre symbole avec le nom non typedef
ed.Si vous utilisez un typedef
sans un nom de structure "réel", lorsque vous devez rechercher des erreurs avec certains compilateurs/débogueurs, vous pouvez devenir fou parce que vous ne pouvez pas vous référer à un nom de structure "réel", puisque typedef
structures sans nom réel sont en fait des structures anonymes.
Cela peut devenir particulièrement problématique si vous devez exporter votre structure avec MIDL et des choses comme ça; voir this post par Raymond Chen pour plus de détails. Enfin, vous pouvez faire des déclarations directes simplement avec le nom de la structure réelle; et si vous n'avez pas de nom de structure (mais seulement le typedef
), vous ne pouvez pas faire de déclarations anticipées.
Vous manquez un 'typedef'? –
Etes-vous sûr d'avoir bien compris la question? 'someobj_t' est un objet, pas un type, vous pourriez avoir omis un seul' typedef' dans votre code. – Kos
la notation '_t', en supposant que vous voulez dire un typedef, si seulement une convention pour distinguer' struct someobj' et 'someobj' (en supposant que c'était le nom typedef'd) - c'est parce que C a deux" namespaces "différents pour ceux-ci (struct et typedef), et vraisemblablement cette convention aide à ajouter de la sémantique au code. –