déclaration de variables dans une macro

12:44 modifié dans Actualités #1
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.

Réponses

  • Philippe49Philippe49 Membre
    12:44 modifié #2
    En C, si on imbrique un code entre accolades, les variables deviennent locales au bloc d'instructions.
    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 ?
  • AliGatorAliGator Membre, Modérateur
    12:44 modifié #3
    Non cas en effet en C (comme en Obj-C et C++) les variables sont locales au bloc (entre accolades) dans lequel elles sont déclarées... et donc ne sont pas visibles dans les blocs de niveau supérieur. Mais elles sont visibles dans les blocs de niveau inférieur ! Par exemple :
    {<br />NSEnumerator* e;<br />while( (obj = [e nextObject]) )<br />{<br />&nbsp; NSEnumerator* e; // boum, redéclaration d&#39;une variable déjà  existante dans ce [i]scope[/i]<br />&nbsp; // ...<br />}
    
    Donc si Renaud utilise sa macro for_each plusieurs fois dans des boucles incluses les unes dans les autres, ça posera problème :(
  • Philippe49Philippe49 Membre
    12:44 modifié #4
    #include <stdio.h>
    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.
  • AliGatorAliGator Membre, Modérateur
    12:44 modifié #5
    Ben merde, t'as raison, c'est vrai ça ! ;)

    Bien vu phrobine 
  • Philippe49Philippe49 Membre
    12:44 modifié #6
    Voici un autre amusement qui peut servir
    #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:
  • 12:44 modifié #7
    Ok, excellent.

    Merci pour cette réponse.
Connectez-vous ou Inscrivez-vous pour répondre.