Entendo correctamente, o tipo de valor VALOR*2 é constante e está ligado à própria substituição, ou seja, o VALOR é também uma constante. O compilador cria duas constantes.
Se assim for, deve estar a criar uma nova substituição.
#define VALUE1 (VALUE*2)
#define VALUE VALUE1
E não é correcto se o VALOR acima do código foi definido como uma constante.
Desculpe, fiquei confuso ao tentar explicar-me))))
Mais uma vez:
#define VALUE 10#define TMP VALUE
#undef VALUE
#define VALUE (TMP*2)
Na altura da segunda definição de VALOR, a macro VALOR não está definida, pelo que VALOR é definido como
(VALUE*2)
porque o TMP foi e ainda é definido por VALOR.
Mas o TMP, após a segunda definição de VALOR, é expandido para
(TMP*2)
(Algo parecido com isto))
O pré-processador apenas preenche o que tem e não importa como e onde é definido. É por isso que tem de ter cuidado com ela. Exemplo:
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x) {return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b))); //400
}
e agora vamos acrescentar uma coisa má à função, nomeadamente um efeito secundário
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x){
Print("Увидивший это второй раз - нубяра vulgaris");
return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b)));
}
E isto é apenas uma inscrição, mas e se o depósito depender desta função?
É impossível criar um novo produto para o mercado, diz erro 500.
O produto foi criado e verificado, diz-se que foi publicado, mas quando se clica no link obtém-se uma resposta de 500.
Funciona de cima para baixo como um substituto de texto. Isto é, "TMP" será substituído por "VALOR".
Isto não é um compilador - é um pré-processador)
transforma-se em
e o seu VALOR é indefinido.
Como é que o undef deve funcionar?
Como é que o undef deve funcionar?
Até este ponto, há "substituição de texto" em curso.
Não é um compilador - é um pré-processador)
transforma-se em
, e o VALOR é indefinido.
Entendo correctamente, o tipo de valor VALOR*2 é constante e está ligado à própria substituição, ou seja, o VALOR é também uma constante. O compilador cria duas constantes.
Se assim for, deve estar a criar uma nova substituição.
#define VALUE VALUE1E não é correcto se o VALOR acima do código foi definido como uma constante.
Até este ponto há "substituição de texto" em curso.
Não corresponde, muda TMP paraVALOR na linha "#define VALUE (TMP*2)" que é a seguir.
Não faz sentido, muda TMP paraVALOR na linha "#define VALUE (TMP*2)" que é a seguir.
E assim as substituições continuam e continuam até ao seu fim.
Existe um código:
A primeira substituição altera o VALOR para 10 ao longo do código até ao #undef VALUE, deixando este
A substituição seguinte muda o TMP para 10. Acontece que
Onde é que eu estou a ir errado?
Existe um código:
A primeira substituição altera o VALOR para 10 ao longo do código até ao #undef VALUE, deixando este
A substituição seguinte muda o TMP para 10. Acontece que
O que é que estou a fazer mal?
Não é 10 o que substitui o TMP, é o VALOR, mas mais tarde, se o VALOR for definido (o que é um chato), é 10.
Veja este passo a passo:
O pré-processador insere fielmente a impressão
e depois, novamente sem truques, substitui o quê? Certo:
e depois apaga todas as directivas do pré-processador e só depois disso é que o compilador recebe isto:
TMP não é 10, mas VALOR é substituído por TMP, e então se VALOR é definido (o que é um problema), é 10
Veja este passo a passo:
O pré-processador insere fielmente a impressão
e depois, novamente sem truques, substitui o quê? Certo:
e depois apaga todas as directivas do pré-processador e só depois disso é que o compilador recebe isto:
Isto não é chamado "de cima para baixo".
Não é chamado de cima para baixo.
Desculpe, fiquei confuso ao tentar explicar-me))))
Mais uma vez:
Na altura da segunda definição de VALOR, a macro VALOR não está definida, pelo que VALOR é definido como
(VALUE*2)porque o TMP foi e ainda é definido por VALOR.
Mas o TMP, após a segunda definição de VALOR, é expandido para
(TMP*2)(Algo parecido com isto))
O pré-processador apenas preenche o que tem e não importa como e onde é definido. É por isso que tem de ter cuidado com ela. Exemplo:
e agora vamos acrescentar uma coisa má à função, nomeadamente um efeito secundário
E isto é apenas uma inscrição, mas e se o depósito depender desta função?