#define in #define

5 sujets de 1 à 5 (sur un total de 5)

  • Gofromiel

      #4829

      Question conne (ou pas) : est-il possible de faire un (ou plusieurs) #define dans un autre #define :

      #define F_WIDGET_BIND_MACROS #undef _area_public

      #define _area_public _widget_public AreaPublic

      #undef _element_public

      #define _element_public _widget_public ElementPublic

      Ca marche très bien normalement, mais sous forme de macro ça coince parce que GCC bloque sur le ‘#’ : syntax error at ‘#’ token.

      Quelqu’un a une idée ??

      Merci ++

      krabob

        #83768

        de mémoire, je pense que ça marche pas, tu peux pas declarer des directive # sous des macros,ya qu’une passe de preprocessage. mais en général ya moyen de se démerder avec des:

        #ifdef okazou

        #define machin truc1

        #else

        #define machin truc2

        #endif

        … c’est trés batard ces directives. Le truc pas connu utile a savoir c’est les options sur le recupérage de param de macro:

        si tu écris #parametre dans la macro , il va enlever le diese et mettre l’expression parametre en chaine de caractère:

        dans veda j’ai une telle macro:

        #define BASEOBJECT_DECLARE_VIRTUALCLASS(_idname,_ClassName,_superClassName)

        const BaseObject::ClassDescription _ClassName::m_Description=

        {

        0L,

        _idname ,

        &(_superClassName::m_Description),

        #_ClassName,

        0L,

        0L,

        0L

        };

        … ou le membre #_ClassName représente un “const char *”

        Bien sur, tu n’as droit qu’a une ligne par define, d’ou la necessité de mettre des “” a la fin des lignes pour anihiler les return. :-D

        Alex

          #83769

          Pareil que Krabob : pas possible y a pas qu’une seule passe de preprocesseur.

          En même temps c’est un peu tordu : une macro qui défini une autre macro…

          Peut-être la solution serait de passer par des variables temporaires :

          #define DEBUT_BIND_MACROS(a,e)

          {

          void * _old_area = _area_public;

          _area_public = (a);

          void * _old_element = _element_public;

          _element_public = e;

          #define FIN_BIND_MACROS

          _area_public = _old_area;

          _element_public = _old_element;

          }

          Mais bon après on a l’impression de faire des MFC tellement y a de macros et qu’on ne sait plus trop ce que l’on fait ;-)

          corto

            #83770

            Hum … moi quand je finis par me retrouver avec ce genre d’écriture qui se complique et qui n’est pas très lisible, je me dis qu’il doit y avoir un truc mal mis en oeuvre dans ce que j’ai fait …

            Je n’ai pas de réponse technique qui viendrait à bout de ce que tu veux faire, malheureusement.

            Gofromiel

              #83771

              Je me doutais un peu du caractère “non-faisable” de l’histoire… dommage, cela aurait était pratique. Je vais utiliser #ifdef alors… Me reste plus qu’à spécifier en très gros et très gras dans la documentation qu’il faut définir la macro AVANT l’include.

              Merci les gars, je savais que vous seriez de bon conseil.

            5 sujets de 1 à 5 (sur un total de 5)

            • Vous devez être connecté pour répondre à ce sujet.

            Forums AmigaOS, MorphOS et AROS Développement #define in #define

            Amiga Impact