Errores, fallos, preguntas - página 2866

 

Todo es posible, sólo hay que añadir una macro

#define  VALUE 10

MACRO( VALUE, VALUE2 )

#define  VALUE   VALUE2*2

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

Resultado: 20

 
A100:

Todo es posible, sólo hay que añadir una macro

Resultado: 20.

Eso está muy bien. No soy bueno adivinando rompecabezas.

 
Vladimir Simakov:

Lo siento, me he confundido al intentar explicarme)))

Una vez más:

En el momento de la segunda definición de VALOR, la macro VALOR no está definida, por lo que VALOR se define como

porque TMP fue y sigue siendo definido por el VALOR.

Pero TMP, tras la segunda definición de VALOR, se amplía a

(Algo así))

El preprocesador sólo rellena lo que tiene y no importa cómo y dónde está definido. Por eso hay que tener cuidado con él. Ejemplo:

y ahora vamos a añadir una cosa mala a la función, es decir, un efecto secundario

Y esto es sólo una inscripción, pero ¿y si el depósito depende de esta función?

divertido) cuando lo consigas)

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE     

lo he hecho bien, después de deshacer la sustitución, la primera línea ya no es 10 y la segunda TMP es VALOR, pero no 10. Es decir, la sustitución está lejos de la asignación.

 
Valeriy Yastremskiy:

divertido) cuando lo consigas)

lo he hecho bien, después de deshacer la sustitución, la primera línea ya no es 10 y la segunda TMP es un VALOR, pero no 10. Es decir, una sustitución está lejos de ser una asignación.

Sí. Una sustitución es exactamente una sustitución, uno a uno. Pero cuando la macro VALUE está definida en su código (no confundir con la directiva del preprocesador), el preprocesador expande aún más TMP->VALUE->10 y si no, TMP->VALUE. En este caso, las directivas del preprocesador no intervienen en el código en sí, ya no están ahí cuando se compila. Ejemplo:

#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:

Sí. La sustitución es exactamente la sustitución, uno a uno. Simplemente, cuando la macro VALUE se define durante la sustitución en su código (no confundir con las directivas del preprocesador), el preprocesador expandirá TMP->VALUE->10, y si no, TMP->VALUE. En este caso, las directivas del preprocesador no intervienen en el código en sí, ya no están ahí cuando se compila. Ejemplo:

Sí, si comentas la segunda sustitución VALOR 20, la declaración de la variable VALOR desaparecerá y el compilador no la verá y regañará)

 
A100:

Todo es posible, sólo hay que añadir una macro

Resultado: 20

Me rindo))

¿Cómo se define?

MACRO

?

 
Vladimir Simakov:

Merindo))

¿Cómo de cierto

?

¿Tan rápido? Todavía no se han unido todos los especialistas... Esperaremos una semana.

Sugerencia: esto también funciona (pero la solución es ligeramente 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 TMP estaba, y sigue estando, definido por el VALOR.

Aquí es donde entra la refutación "desde arriba".

De lo contrario, TMP no habría sido "tal y como se definió, por lo que sigue siendo definido", sino que habría sido sustituido previamente por 10 (al que se sustituye VALOR).

Así que el preprocesador no está procesando el código línea por línea. Lo que queda por saber es cómo.


@A100, si no te importa, en pocas palabras.
No es lo suficientemente interesante como para buscar en Google y leer, pero sí para preguntar.

¿Qué hay de malo en mi lógica?

Imaginé que las cadenas se analizan secuencialmente. Así que no hay ningún valor indefinido a la derecha:

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

Sugerencia: esto también funciona (pero la solución es ligeramente diferente)

Por lo tanto, es idéntica a la acción de MACRO y MACRO2.

 
Andrey Khatimlianskii:

¿Qué hay de malo en mi 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