Déclaration de variable dans une macro
Bonjour,
Indépendamment de la propreté du code et de l'hérésie de procéder ainsi, soit le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
#define DEFINITION_VARIABLE(_type_, _valeur_) { \
_type_ toto; \
toto = (_valeur_) * ((_valeur_) - 1); \
}
#define COMPARE_AFFECTE(_type2_, _valeur2_) { \
if (toto > (_valeur2_)) \
*sortie = (_type_2)toto: \
else \
*sortie = (_type_2)0; \
return; \
}
void short2int(short entree, int * sortie)
{
DEFINITION_VARIABLE(short, entree - 2);
COMPARE_AFFECTE(int, 125);
}
void short2long(short entree, long * sortie)
{
DEFINITION_VARIABLE(short, entree + 3);
COMPARE_AFFECTE(long , 3254);
}
void uchar2short(unsigned char entree, short * sortie)
{
DEFINITION_VARIABLE(unsigned char, entree);
COMPARE_AFFECTE(short , 17);
} |
etc.
Dans chacune de mes fonctions, je vais avoir pour COMPARE_AFFECTE le message d'erreur "variable toto non déclaré".
J'avoue être surpris puisque je pensais naïvement que le pré-processeur faisait du copier / remplacer de macros avant la compilation.
J'ai raté quelque chose ?
Merci d'avance pour vos réponses.
[Résolu] Déclaration de variable dans une macro
Citation:
Envoyé par
gangsoleil
Bonjour,
Je pense que le mieux dans ce cas est d'aller voir quelle est le code apres passage du preprocesseur.
Code:
gcc -E mon_fichier.c > mon_fichier_preprocess.c
[Edit]
J'avais un peu de temps, j'ai fait le test. Tu as simplement un probleme de declaration de bloc : dans DEFINITION_VARIABLE, tu declares _toto_ dans un bloc ; donc a la fin du bloc, la variable toto n'existe plus.
Oui, j'ai fini par comprendre tout à l'heure...
On m'avait toujours appris de déclarer une macro avec { \ à la fin de la première ligne et } à la toute fin.
En fait, si on retire les {}, ça marche.
Citation:
Envoyé par
gangsoleil
[Edit2]
Tu as aussi un soucis dans ton code tu as _type2_ et _type_2 :
Code:
1 2 3
| #define COMPARE_AFFECTE(_type2_, _valeur2_) { \
if (toto > (_valeur2_)) \
*sortie = (_type_2)toto: \ |
En fait, j'ai réécris un code d'exemple, je n'avais pas accès au code de base. Donc pas de souci de ce côté.
Merci pour votre aide néanmoins.