Pregunta

Actualización 3

No importa. Yo un poco conseguí lo que buscaba. Lo siguiente da identificadores únicos dentro de una clase.

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

Actualización 2

Boost preprocesador

Me pondrá en práctica algo parecido a un mapa de mensajes con esta funcionalidad.

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

La cosa es que, para cada MAP_DECL, necesito expandir la macro en 2 lugares.

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

preprocesador debe Boost (en teoría) me permitirá acumular MAP_DECL en una secuencia y expandirlo hasta func () al final (al mismo tiempo que la expansión de los campos de la clase a medida que avanzamos).


Actualización 1

Estoy usando la biblioteca Boost preprocesador en el momento. Actualmente estoy atascado crear una nueva variable / definición de la macro como la siguiente cada vez que tengo que añadir algo a la secuencia.

Estoy tratando de ampliar las secuencias del preprocesador Boost y estoy atascado haciendo esto en el momento

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

ORIGINAL

Supongamos que tengo el siguiente código

#define CUR 2
#define CUR CUR + 2

¿Cómo fuerzo la segunda fila para usar el valor del CUR de la primera línea?

¿Fue útil?

Solución

Sucintamente, no se puede.

En el momento en que se expande CUR (después de la segunda #define), el preprocesador sustituirá a una instancia de CUR con CUR + 2, y 'pintura azul' el nombre CUR (no expandiéndolo más lejos). A partir de entonces, el compilador C ve CUR + 2, que la mayoría probabilidad da un error de compilación.

Otros consejos

Incluso si se pudiera hacer eso, es peligroso.
Ejemplo:

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

No se puede hacer eso, sólo se puede #define cada macro una vez, de lo contrario el compilador se derramará un error.

He intentado hacer algo similar en un punto (introducción de secuencias para impulsar preprocesador). Me golpeó la pared duro (por lo que dijo Jonathan en su respuesta) y terminó haciendo algo completamente diferente.

Más tarde descubrí que las secuencias de tipo impulso MPL tienen misma limitación efectiva (que hace totalmente sentido, pero a veces no se ve una pared hasta que realmente encuentras con ella:))

.

Más o menos, debe definir la secuencia total o darle nombre diferente.

Usted probablemente está definiendo una variable miembro y luego hacer cosas con ella en la función (registro?). Si se mantiene mensajes en un contenedor, puede hacer que su MAP_DECL añadir un mensaje en él, y luego en la función acaba de hacer un bucle.

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

Si cada mensaje es de tipo separado, tipo de intento de borrado (impulso :: hubiera) o hacer que heredan de una clase base y tienda que.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top