Usage des MACRO

wizzo Messages postés 35 Date d'inscription jeudi 12 septembre 2002 Statut Membre Dernière intervention 25 octobre 2006 - 12 juil. 2006 à 17:26
wizzo Messages postés 35 Date d'inscription jeudi 12 septembre 2002 Statut Membre Dernière intervention 25 octobre 2006 - 13 juil. 2006 à 11:57
Salut a tous.

Je relance la discussion eternelle sur l'usage des macro.

En theorie, elles sont à proscrire car n'ayant aucune idée des scopes/portées des namespace, classes et autres, et ne sont pas typesafe.
Ce qui elimine leur usage pour les constantes, fonctions, etc (remplacé par les const float var = , les fonctions inline et template)
Je suis parfaitement d'accord avec ça.

Mais de temps en temps je vois sur un site qqun qui dit ne jamais utiliser de macro, alors qu'il m'arrive de rencontrer des cas ou je me sens obligé d'en utiliser.
Voila un exemple :

J'ai implementé un système de RTTI. Je veux que pour chaque classe que je déclare avoir un membre static s_kType. MAIS voyons le code suivant :

class cBaseRTTI {
    static cRTTI s_kType;
    cRTTI  GetRTTI();
    /*...*/
};

class cDerivee : public cBaseRTTI  {
    /*...*/

};

Mon membre static est LE MEME pour toutes les classes dérivées !
cad que dans l'ordre:
1 - je créer cBaseRTTI
2 - cBaseRTTI var;
     var.GetRTTI() va me dire que ma variable est de type cBaseRTTI
3 - je créer  cDerivee
    cDerivee var2;
    var2.GetRTTI() va me dire que ma variable est de type cDerivee, ce qui est OK
    MAIS
    cBaseRTTI var;

     var.GetRTTI() va me dire que ma variable est de type cDerivee !

Donc j'ai trouvé une solution, en ajoutant le code relatif au RTTI dans une macro, et en faisant un DECLARE_RTTI(cDerivee) et IMPLEMENT_RTTI(cDerivee), qui marche tres bien et qui me statisfait dans l'ensemble, mais j'aimerai bien savoir COMMENT on pourrai faire sans macro.

Voila, dites moi ce que vous pensez,
Eric

2 réponses

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
12 juil. 2006 à 20:25
Le fait que le C++ offre des supports permettant de se passer de macros
la ou on avait l'habitude de les utiliser en C ne veut pas dire que
leurs utilisation est à bannir, une macro reste une macro. C'est juste
qu'on sera moins souvent ammener a en utilisé.


Par contre pour ton histoire de RTTI fait maison j'ai pas trop compris
comment tu l'implementais, tu peux donner plus de détail ?
0
wizzo Messages postés 35 Date d'inscription jeudi 12 septembre 2002 Statut Membre Dernière intervention 25 octobre 2006
13 juil. 2006 à 11:57
"Mon membre static est LE MEME pour toutes les classes dérivées !"

Après quelques tests, je me suis aperçu que mon postulat etait erroné
en faisant MyClass::s_kType j'avais toujours accès au membre de la classe mère, mais il suffisait d'inserer un getter surchargé dans le process pour etre sur de recuperer le s_kType de la classe courante.

Au final, la macro ke j'utilise ne sert qu'à simplifier l'ecriture du code.

Si tu veux voir ce que ça donne (et me donner ton avis au passage pkoi pas :p),  j'ai uploadé un exemple ici :
http://ece.fr:8000/~miffre/public/dev/RTTI/RTTI.rar

Mais donc on est d'accord, les macro restent tres utiles pour automatiser certains bouts de code répétitifs.
Eric
0
Rejoignez-nous