Erros, bugs, perguntas - página 2866

 

Tudo é possível, apenas uma macro precisa de ser adicionada

#define  VALUE 10

MACRO( VALUE, VALUE2 )

#define  VALUE   VALUE2*2

void f( int i = VALUE ) { Print( i ); }
void OnStart()
{
        f();
}

Resultado: 20

 
A100:

Tudo é possível, apenas uma macro precisa de ser adicionada

Resultado: 20.

Isso é muito bom. Não sou bom a adivinhar puzzles.

 
Vladimir Simakov:

Desculpe, fiquei confuso enquanto tentava 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

porque o TMP foi e ainda é definido por VALOR.

Mas o TMP, após a segunda definição de VALOR, é expandido para

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

engraçado) quando o recebe)

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE     

acertou, após desfazer a substituição, a primeira linha já não é 10 e a segunda TMP é VALOR, mas não 10. Isto é, a substituição está longe de ser uma tarefa.

 
Valeriy Yastremskiy:

engraçado) quando o recebe)

acertou, após desfazer a substituição, a primeira linha já não é 10 e o segundo TMP é um VALOR, mas não 10. Isto é, uma substituição está longe de ser uma tarefa.

Sim. Uma substituição é exactamente uma substituição, um-para-um. Mas quando a macro VALOR é definida no seu código (não confundir com a directiva do pré-processador), o pré-processador expande ainda mais TMP->VALUE->10, e se não, TMP->VALUE. Neste caso, as directivas do pré-processador não estão envolvidas no próprio código, já não estão lá quando compiladas. Exemplo:

#define  VALUE 10
#define  TMP VALUE

void OnStart()
{
   Print(TMP); //10
if (false){
   #undef  VALUE
   #define  VALUE 20
   Print(TMP);}
else Print(TMP); //20
}
 
Vladimir Simakov:

Sim. A substituição é exactamente uma substituição, um-para-um. Simplesmente, quando a macro VALOR é definida durante a substituição no seu código (não confundir com as directivas do pré-processador), o pré-processador irá expandir TMP->VALUE->10, e se não, TMP->VALUE. Neste caso, as directivas do pré-processador não estão envolvidas no próprio código, já não estão lá quando compiladas. Exemplo:

Sim, se comentar a segunda substituição VALOR 20, a declaração da variável VALOR desaparecerá e o compilador não a verá e repreenderá)

 
A100:

Tudo é possível, apenas uma macro precisa de ser adicionada

Resultado: 20

Eu desisto))))

Como é definido?

MACRO

?

 
Vladimir Simakov:

Eu desisto))))

Quão certo

?

Tão depressa? Nem todos os especialistas se juntaram ainda... Vamos esperar uma semana.

Dica: isto também funciona (mas a solução é ligeiramente diferente)

#define  VALUE1 10
#define  VALUE2 5

MACRO2( VALUE1, VALUE12 )
MACRO2( VALUE2, VALUE22 )

#define  VALUE1  VALUE12*2
#define  VALUE2  VALUE22*3

int f1( int i = VALUE1 ) { return i; }
int f2( int i = VALUE2 ) { return i; }
void OnStart()
{
        Print(f1(),":",f2());
}

Resultado: 20:15

 
Vladimir Simakov:

porque o TMP foi, e ainda é, definido por VALOR.

É aqui que entra a refutação "de cima para baixo".

Caso contrário, o TMP não teria sido "como definido, pelo que permanece definido", mas teria sido anteriormente substituído por 10 (ao qual o VALOR é substituído).

Portanto, o pré-processador não está a processar o código linha a linha. O que ainda falta descobrir é como.


@A100, se não se importar, em poucas palavras.
Não é suficientemente interessante para pesquisar e ler no Google, mas o suficiente para perguntar.

O que está errado com a minha lógica?

Imaginei que as cordas são analisadas sequencialmente. Portanto, não há nenhum valor indefinido à direita:

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10, следовательно VALUE = 20
 
A100:

Dica: isto também funciona (mas a solução é ligeiramente diferente)

Tão idêntica em acção à MACRO e MACRO2.

 
Andrey Khatimlianskii:

O que está errado com a minha lógica?

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10 VALUE
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10 EMPTY, следовательно VALUE = 20 EMPTY