Pergunta

Atualização 3:

Deixa para lá. Eu meio que consegui o que estava procurando. O seguinte fornece identificadores exclusivos dentro de uma aula.

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

Atualização 2:

Aumente o pré -processador

Vou implementar algo semelhante a um mapa de mensagens com essa funcionalidade.

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

O problema é que, para cada map_decl, preciso expandir a macro em 2 lugares.

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

O pré -processador do Boost deve (teoricamente) me permitir acumular MAP_DECL em uma sequência e expandi -la para Func () no final (enquanto simultaneamente expande os campos de classe à medida que avançamos).


Atualização 1:

Estou usando a biblioteca de pré -processador Boost no momento. Atualmente, estou preso criando uma nova variável/definição de macro, como a seguinte, toda vez que preciso adicionar algo à sequência.

Estou tentando expandir as sequências de pré -processador de Boost e estou preso fazendo isso no momento

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

Original:

Suponha que eu tenha o seguinte código

#define CUR 2
#define CUR CUR + 2

Como forço a segunda linha a usar o valor de Cur da primeira linha?

Foi útil?

Solução

Sucintamente, você não pode.

No momento em que Cur é expandido (após o segundo #define), o pré -processador substituirá uma instância de curs por cur + 2 e 'tinta azul' o nome curs (não expandindo -o mais). Posteriormente, o compilador C vê Cur + 2, que provavelmente produz um erro de compilação.

Outras dicas

Mesmo se você pudesse fazer isso, é perigoso.
Exemplo:

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

Você não pode fazer isso, você pode apenas #Definir cada macro uma vez, caso contrário, o compilador derramará um erro.

Tentei fazer algo semelhante em um ponto (Anexando -se para aumentar as sequências pré -processador). Eu bati com força na parede (por causa do que Jonathan disse em sua resposta) e acabei fazendo coisas completamente diferentes.

Mais tarde, descobri que as seqüências do tipo MPL Boost têm a mesma limitação eficaz (o que faz sentido totalmente, mas às vezes você não vê uma parede até realmente esbarrar nela :)).

Você praticamente deve definir sequência inteira ou dar um nome diferente.

Você provavelmente está definindo alguma variável de membro e depois fazendo as coisas com ela na função (registrando?). Se você mantiver mensagens em um contêiner, poderá fazer com que seu map_decl adicione uma mensagem e, na função, basta fazer um loop.

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

Se cada mensagem for do tipo separado, tente o tipo Apagar (Boost :: alguma) ou faça com que ele herde de alguma classe base e armazene isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top