déclaration de variables dans une macro
Hello,
En prévision de l'objective-c 2 et plus particulièrement des "fast enumations", j'aimerais créer des macro définies différemement sous leopard et sous les pre-leopard afin de parcourir des collections.
Pour les systèmes pre-leopard, elle est définie comme suit:
[tt]#define for_each(container, object, enumerator) \
NSEnumerator *enumerator = [container objectEnumerator]; \
while ((object = [enumerator nextObject]))[/tt]
seulement, il y a un truc qui ne me plait pas là dedans: l'argument "enumerator", qui doit être mis car si la macro est exécutée plusieurs fois dans un même bloc, ça peut soit créer des conflits (boucles imbriquées) soit des alertes pour cause de redéfinitions de variables si les boucles se suivent.
Pour moi l'idéal serait soit que la macro soit capable de "savoir" si une variable de ce nom a déjà été déclarée (et dans ce cas, pas de redéfinitions), soit de supprimer cet argument et créer un nouveau pointeur à chaque appel (ce qui se fait maintenant, mais manuellement).
Sinon autre solution, c'est de définir l'énumerateur en dehors de la macro, mais là ça me plait pas non plus car il ne faut pas d'énumérateur sous leopard.
Est-ce que c'est faisable de manière automatique ou non?
Merci d'avance.
En prévision de l'objective-c 2 et plus particulièrement des "fast enumations", j'aimerais créer des macro définies différemement sous leopard et sous les pre-leopard afin de parcourir des collections.
Pour les systèmes pre-leopard, elle est définie comme suit:
[tt]#define for_each(container, object, enumerator) \
NSEnumerator *enumerator = [container objectEnumerator]; \
while ((object = [enumerator nextObject]))[/tt]
seulement, il y a un truc qui ne me plait pas là dedans: l'argument "enumerator", qui doit être mis car si la macro est exécutée plusieurs fois dans un même bloc, ça peut soit créer des conflits (boucles imbriquées) soit des alertes pour cause de redéfinitions de variables si les boucles se suivent.
Pour moi l'idéal serait soit que la macro soit capable de "savoir" si une variable de ce nom a déjà été déclarée (et dans ce cas, pas de redéfinitions), soit de supprimer cet argument et créer un nouveau pointeur à chaque appel (ce qui se fait maintenant, mais manuellement).
Sinon autre solution, c'est de définir l'énumerateur en dehors de la macro, mais là ça me plait pas non plus car il ne faut pas d'énumérateur sous leopard.
Est-ce que c'est faisable de manière automatique ou non?
Merci d'avance.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je pense que cela doit rester valide en obj C, sans avoir vérifier néammoins.
N'y aurait-il pas une solution de ce côté en incluant des accolades dans la macro ?
int main(void){
int x=5;
{
int x=2;
printf("%d\n",x);
}
printf("%d\n",x);
return 0;
}
Pas de problème en C. La seconde variable masque la première.
Bien vu phrobine
#include <stdio.h>
#define initVariables static int x=0
#define variable(x) e##x
#define action {int variable(x)=x;printf("%d\n",variable(x));x++;}
int main(void){
initVariables;
action
action
action
return 0;
}
:kicking: :kicking:
Merci pour cette réponse.