OVH Cloud OVH Cloud

Utilisation typedef

3 réponses
Avatar
JM
Bonjour

Supposons :

1) typedef struct A { int x; int y; }

A variable;

2) typedef struct { int x; int y; } A

A variable

Quand je compile, à priori, il n'y a pas de différence.
Est-ce normal?
Je pige rien à ce typedef!

Merci

3 réponses

Avatar
Marc Boyer
Le 12-09-2006, JM a écrit :
Bonjour

Supposons :

1) typedef struct A { int x; int y; }

A variable;

2) typedef struct { int x; int y; } A

A variable

Quand je compile, à priori, il n'y a pas de différence.
Est-ce normal?


En C++, oui.

Je pige rien à ce typedef!


Ben, en fait, en C++, il n'y a pas de raison de
faire un typedef sur un struct comme tu le fais.
C'était utile en C, mais C++ a décidé de faire
qu'implicitement, la definition de 'struct A'
déclare l'indentifiant de type 'A'.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)

Avatar
JM

Je pige rien à ce typedef!


Ben, en fait, en C++, il n'y a pas de raison de
faire un typedef sur un struct comme tu le fais.
C'était utile en C, mais C++ a décidé de faire
qu'implicitement, la definition de 'struct A'
déclare l'indentifiant de type 'A'.



Ok, merci


Avatar
kanze
JM wrote:

Supposons :

1) typedef struct A { int x; int y; }

A variable;

2) typedef struct { int x; int y; } A

A variable

Quand je compile, à priori, il n'y a pas de différence.
Est-ce normal?


À peu près. En fait, en C++, avec le « struct A », on a défini
un nouveau type, dont le nom est A. Dans ton exemple 1), le
typedef ne sert absolument à rien, parce qu'il ne définit aucun
symbole. (Et note bien qu'après la déclaration 1) en C, tu ne
peux toujours pas écrire :
A variable;
.)

Ton cas 2) est plus compliqué. Logiquement, tu as défini une
structure anonyme, sans nom, et ensuite, tu as dit que A est un
synonyme de ce structure. Toujours anonyme. Mais pour des
raisons assez complexes, liées à la compatibilité C, si on
définit une structure anonyme dans un typedef, il reçoit en fait
le premier nom qui lui typedef, donc, ici, A, et n'est plus
anonyme.

Je pige rien à ce typedef!


Normalement, c'est un moyen de donner un nom à un type déjà
existant. On écrira donc :
struct A { int x; int y; } ;
typedef A B ;
A un ;
B deux ;
(Ici, un et deux ont le même type.) Rien en fait de plus facile.
Seulement, tu t'es heurté à des cas spéciaux présents uniquement
pour des raisons de compatibilité C, qui ne font effectivement
pas de sens. J'imagine que sans les contraintes de compatibilité
C, les deux typedefs ci-dessus seraient illégaux tous les deux,
le premier, parce qu'il ne typedefe en fait rien, et le
deuxième, parce que sans les hacks de compatibilité C, il n'y a
rien que tu peux faire avec une structure anonyme, et il n'y
aurait pas de raison à la permettre.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34