Força o pré -processador a usar uma definição anterior em uma redefinição
-
21-09-2019 - |
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:
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?
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.