Erros, bugs, perguntas - página 2865

 

É 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.

 
fxsaber:

Funciona de cima para baixo como um substituto de texto. Isto é, "TMP" será substituído por "VALOR".

Vladimir Simakov:

Isto não é um compilador - é um pré-processador)

transforma-se em

e o seu VALOR é indefinido.

Como é que o undef deve funcionar?

 
Andrey Khatimlianskii:

Como é que o undef deve funcionar?

Até este ponto, há "substituição de texto" em curso.

 
Vladimir Simakov:

Não é um compilador - é um pré-processador)

transforma-se em

, e o VALOR é indefinido.

#define  VALUE (VALUE*2)

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.

 
fxsaber:

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.

 
Andrey Khatimlianskii:

Não faz sentido, muda TMP paraVALOR na linha "#define VALUE (TMP*2)" que é a seguir.

#define  MACROS TEXT
 // В этом интервале везде идет замена в исходнике MACROS на TEXT, как делалось бы в текстовом редакторе.
#undef  MACROS
E assim vai a substituição até que todas as substituições estejam completas.
 
fxsaber:
E assim as substituições continuam e continuam até ao seu fim.

Existe um código:

#define  VALUE 10       // 
#define  TMP VALUE      // 
#undef  VALUE           // 
#define  VALUE (TMP*2)  // 

A primeira substituição altera o VALOR para 10 ao longo do código até ao #undef VALUE, deixando este

#define  TMP 10
#define  VALUE (TMP*2)

A substituição seguinte muda o TMP para 10. Acontece que

#define  VALUE (10*2)

Onde é que eu estou a ir errado?

 
Andrey Khatimlianskii:

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:

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE            
#define  VALUE (TMP*2)

void OnStart(void)
{
   Print(VALUE)
}

O pré-processador insere fielmente a impressão

Print((TMP*2));

e depois, novamente sem truques, substitui o quê? Certo:

Print((VALUE*2));

e depois apaga todas as directivas do pré-processador e só depois disso é que o compilador recebe isto:

void OnStart(void)
{
   Print((VALUE*2));
}
 
Vladimir Simakov:

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".

 
Andrey Khatimlianskii:

Não é chamado de cima para baixo.

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;}

void OnStart(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;}

void OnStart(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?