Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

#define ou typedef ?

4 réponses
Avatar
mpg
Bonjour,

Tout est un peu dans le titre... Quelle est la différence entre, mettons

#define ENTIER unsigned long int

et

typedef {unsigned long int} entier

D'un point de vue technique, je comprends bien que la première
instruction est traitée par le préprocesseur, alors que la deuxième
s'adresse au compilateur. Mais concrètement, à l'usage, faut-il préférer
l'une à l'autre ? toujours ou dans certains cas ?

Merci pour vos lumières,
Manuel.

4 réponses

Avatar
Pierre Maurette
Bonjour,

Tout est un peu dans le titre... Quelle est la différence entre, mettons

#define ENTIER unsigned long int

et

typedef {unsigned long int} entier

D'un point de vue technique, je comprends bien que la première instruction
est traitée par le préprocesseur, alors que la deuxième s'adresse au
compilateur. Mais concrètement, à l'usage, faut-il préférer l'une à l'autre ?
toujours ou dans certains cas ?


Pour moi, il est évident qu'il faut utiliser le typedef si on définit
un type. Le compilateur fera les vérifications adéquates.
C'est tellement évident que j'ai du mal à donner dans la minute des
raisons objectives ;-)
Un exemple quand même:

#define PINT int*
typedef int* pint_t;
PINT p1, p2; // p1 est un pointeur, mais p2 est un int
pint_t p3, p4;

Pensez à choisir un nommage efficace. Je suffixe en _t pour les types,
mais ce n'est peut-être pas l'idéal, car c'est la convention de la
norme. Je n'en sais rien...

--
Pierre Maurette

Avatar
Laurent Deniau
Pierre Maurette wrote:

Bonjour,

Tout est un peu dans le titre... Quelle est la différence entre, mettons

#define ENTIER unsigned long int

et

typedef {unsigned long int} entier



ceci ne compile pas.

D'un point de vue technique, je comprends bien que la première
instruction est traitée par le préprocesseur, alors que la deuxième
s'adresse au compilateur. Mais concrètement, à l'usage, faut-il
préférer l'une à l'autre ? toujours ou dans certains cas ?



Pour moi, il est évident qu'il faut utiliser le typedef si on définit un
type. Le compilateur fera les vérifications adéquates.


Tu veux dire lors de la definition du typedef au lieu de l'utilisation
du define, plus tardive?

C'est tellement évident que j'ai du mal à donner dans la minute des
raisons objectives ;-)


La seule raison valable que je connaisse, c'est quand on veut faire de
la meta-programmation avec le preprocesseur qui necessiterait la
connaissance de certains types. Dans tous les autres cas, le typedef me
semble plus adapte.

Un exemple quand même:

#define PINT int*
typedef int* pint_t;
PINT p1, p2; // p1 est un pointeur, mais p2 est un int


Et tu trouves ca bien?

pint_t p3, p4;


Je prefere de loin.

Pensez à choisir un nommage efficace. Je suffixe en _t pour les types,
mais ce n'est peut-être pas l'idéal, car c'est la convention de la
norme. Je n'en sais rien...


Yep.

a+, ld.


Avatar
Harpo
Pierre Maurette wrote:

mais ce n'est peut-être pas l'idéal, car c'est la convention de
la norme.


J'adore...

--
http://patrick.davalan.free.fr/

Avatar
Vincent Lefevre
Dans l'article ,
Pierre Maurette écrit:

Bonjour,

Tout est un peu dans le titre... Quelle est la différence entre, mettons

#define ENTIER unsigned long int

et

typedef {unsigned long int} entier


Pour moi, il est évident qu'il faut utiliser le typedef si on définit
un type. Le compilateur fera les vérifications adéquates.


Pas plus. Un typedef ne permet pas de définir un type, mais un alias
d'un type existant (sans le typedef). Bref, d'un certain point de
vue, le typedef est assez similaire au préprocesseur, sauf qu'il
intervient à un niveau sémantique et permet de faire des constructions
impossibles à faire avec le préprocesseur (e.g. si le type en question
est un pointeur).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)