Question

Mise à jour 3 :

Peu importe. Je suis un peu ce que je cherchais. Ce qui suit donne des identificateurs uniques dans une classe.

static const int _counter_start = __COUNTER__;
static const int val1 = __COUNTER__ - _counter_start;
static const int val2 = __COUNTER__ - _counter_start;

Mise à jour 2 :

Boost préprocesseur

Je vais mettre en œuvre quelque chose qui ressemble à une carte de message avec cette fonctionnalité.

class a
{
...
    MAP_BEGIN()
    MAP_DECL...
    MAP_END()
...
};

La chose est, pour chaque MAP_DECL, je dois développer la macro dans 2 endroits.

class a
{    
    virtual void func()
    {        
        ...
        //does something with the decl declaration        
    }
    ...
    //also expand some stuff here    
}

préprocesseur Boost devrait (théoriquement) me permettre d'accumuler MAP_DECL dans une séquence et divertissez dans func () à la fin (tout en développant les champs de classe que nous allons).


Mise à jour 1 :

J'utilise la bibliothèque Boost préprocesseur pour le moment. Je suis actuellement coincé la création d'une nouvelle variable macro / définition comme suit chaque fois que je dois ajouter quelque chose à la séquence.

Je suis en train de développer des séquences Boost préprocesseur et je suis coincé faire cela au moment

#define SEQ (w)(x)(y)(z) 
#define SEQ2 BOOST_PP_SEQ_PUSH_BACK(SEQ, a)

Original :

Supposons que j'ai le code suivant

#define CUR 2
#define CUR CUR + 2

Comment forcer la 2ème ligne à utiliser la valeur de CUR de la première ligne?

Était-ce utile?

La solution

Succinctement, vous ne pouvez pas.

A l'heure où CUR agrandi (après la seconde #define), le préprocesseur remplace une instance de CUR avec CUR + 2, et «peinture bleue du nom de CUR (pas l'étendre plus loin). Par la suite, le compilateur C voit CUR + 2, dont la plupart donne probablement une erreur de compilation.

Autres conseils

Même si vous pouvez le faire, il est dangereux.
Exemple:

#define CUR 2
#define CUR CUR + 2
...
int x = CUR*4; // x = 2 + 2 * 4

Vous ne pouvez pas faire cela, vous ne pouvez #define chaque macro une fois, sinon le compilateur renversez une erreur.

J'ai essayé de faire quelque chose de similaire à un moment donné (annexant pour stimuler les séquences de préprocesseur). J'ai frappé le dur mur (à cause de ce que Jonathan a dit dans sa réponse) et a fini par faire tout autre chose.

Plus tard, je trouve que les séquences de type boost de MPL ont la même limitation efficace (ce qui rend tout à fait sens, mais parfois vous ne voyez pas un mur jusqu'à ce que vous bosse réellement en elle:))

.

Vous devez définir à peu près la séquence entière ou lui donner le nom différent.

Vous définissez probablement une variable membre et ensuite faire des choses avec elle dans la fonction (enregistrement?). Si vous conservez des messages dans un conteneur, vous pouvez faire votre MAP_DECL ajouter un message dans, puis dans la fonction juste faire une boucle.

#define MAP_BEGIN std::vector<Message> m_messages; \
  void buildMap() {
#define MAP_END }
#define MAP_DECL(...) m_messages.push_back(...);

Si chaque message est de type séparé, essayez l'effacement de type (boost :: tout) ou de les faire hériter d'une certaine classe de base et magasin qui.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top