Domanda

Aggiorna 3:

Mai mente.Ho un pò ottenuto quello che stavo cercando.Il seguente dà identificatori univoci all'interno di una classe.

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

Aggiorna 2:

Aumentare Il Preprocessore

Sarò implementare qualcosa di simile a una mappa del messaggio con questa funzionalità.

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

Il fatto è che, per ogni MAP_DECL, ho bisogno di espandere la macro in 2 posti.

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

Aumentare il preprocessore dovrebbe (in teoria) mi permettono di accumulare MAP_DECL in una sequenza e espandere func() alla fine (e contemporaneamente ampliare i campi di classe come andiamo).


Update 1:

Sto usando il Boost del Preprocessore biblioteca al momento.Attualmente sto bloccato la creazione di una nuova variabile macro/definizione come il seguente, ogni volta che ho bisogno di aggiungere qualcosa alla sequenza.

Sto cercando di espandere Aumentare il Preprocessore sequenze e mi sono bloccato facendo questo, al momento

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

Originale:

Supponiamo di avere il seguente codice

#define CUR 2
#define CUR CUR + 2

Come faccio a forzare la linea 2 per utilizzare il valore di CUR dalla prima riga?

È stato utile?

Soluzione

Sinteticamente, non è possibile.

Al momento CUR viene espanso (dopo il secondo #define), il preprocessore sostituisce un'istanza CUR con CUR + 2, e 'vernice blu' il nome CUR (non espandere riutilizzarlo). Da allora in poi, il compilatore C vede CUR + 2, che molto probabilmente si ottiene un errore di compilazione.

Altri suggerimenti

Anche se si potesse fare che, è pericoloso.
Esempio:

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

Non si può fare, si può solo #define ogni macro una volta, altrimenti il compilatore fuoriuscita di un errore.

Ho provato a fare qualcosa di simile ad un certo punto (aggiungendo per amplificare le sequenze del preprocessore). Mi ha colpito il duro muro (a causa di quello che ha detto Jonathan nella sua risposta) e finito per fare cosa completamente diversa.

Più tardi ho scoperto che le sequenze di tipo spinta MPL hanno stessa limitazione efficace (che lo rende totalmente senso, ma a volte non si vede un muro fino a quando effettivamente imbattersi in esso:))

.

È praticamente necessario definire tutta la sequenza o dare nome diverso.

Probabilmente si sta definendo una variabile membro e poi fare le cose con esso nella funzione (registrazione?). Se si mantiene i messaggi in un contenitore, è possibile rendere il MAP_DECL aggiungere un messaggio in esso, e quindi nella funzione solo fare un ciclo for.

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

Se ogni messaggio è di tipo separato, provare la cancellazione di tipo (boost :: presente) o di far loro ereditare da una classe base e memorizzare tale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top