Errores, fallos, preguntas - página 2865

 

Es imposible crear un nuevo producto para el mercado, dice error 500.

El producto ha sido creado y comprobado, dice que ha sido publicado, pero cuando se hace clic en el enlace se obtiene una respuesta de 500.

 
fxsaber:

Funciona de arriba hacia abajo como un reemplazo de texto. Es decir, "TMP" será sustituido por "VALOR".

Vladimir Simakov:

Esto no es un compilador - es un preprocesador)

se convierte en

y su VALOR es indefinido.

¿Cómo se supone que funciona undef?

 
Andrey Khatimlianskii:

¿Cómo se supone que funciona undef?

Hasta este punto, hay una "sustitución de texto" en marcha.

 
Vladimir Simakov:

No es un compilador, es un preprocesador)

se convierte en

y el VALOR es indefinido.

#define  VALUE (VALUE*2)

He entendido bien, el tipo de valor VALOR*2 es const y está ligado a la propia sustitución, es decir, el VALOR es también una constante. El compilador crea dos constantes.

Si es así, debe estar creando una nueva sustitución.

#define  VALUE1 (VALUE*2)
#define  VALUE VALUE1

Y no es correcto si el VALOR por encima del código se definió como una constante.

 
fxsaber:

Hasta este punto se está produciendo una "sustitución de texto".

No coincide, cambia TMP porVALUE en la línea "#define VALUE (TMP*2)" que está después.

 
Andrey Khatimlianskii:

No cuadra, cambia TMP porVALUE en la línea "#define VALUE (TMP*2)" que está después.

#define  MACROS TEXT
 // В этом интервале везде идет замена в исходнике MACROS на TEXT, как делалось бы в текстовом редакторе.
#undef  MACROS
Y así sucesivamente hasta completar todas las sustituciones.
 
fxsaber:
Y así las sustituciones siguen y siguen hasta que todas terminan.

Hay un código:

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

La primera sustitución cambia el VALOR a 10 en todo el código hasta #undef VALOR, dejando esto:

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

La siguiente sustitución cambia el TMP a 10. Resulta que

#define  VALUE (10*2)

¿En qué me estoy equivocando?

 
Andrey Khatimlianskii:

Hay un código:

La primera sustitución cambia el VALOR a 10 en todo el código hasta #undef VALOR, dejando esto:

La siguiente sustitución cambia el TMP a 10. Resulta que

¿Qué estoy haciendo mal?

No es el 10 el que se sustituye por TMP, es el VALOR, pero después, si se define el VALOR (que es un coñazo), es el 10.

Mira este paso a paso:

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

void OnStart(void)
{
   Print(VALUE)
}

El preprocesador inserta fielmente Print

Print((TMP*2));

y luego, de nuevo sin trucos, sustituye ¿qué? Sí:

Print((VALUE*2));

y luego borra todas las directivas del preprocesador y sólo después de eso el compilador obtiene esto:

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

TMP no es 10, sino que se sustituye VALOR por TMP, y entonces si se define VALOR (lo cual es un problema), es 10

Mira este paso a paso:

El preprocesador inserta fielmente Print

y luego, de nuevo sin trucos, sustituye ¿qué? Sí:

y luego borra todas las directivas del preprocesador y sólo después de eso el compilador obtiene esto:

Esto no se llama "top-down".

 
Andrey Khatimlianskii:

No se llama top-down.

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

Una vez más:

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

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

(VALUE*2)

porque TMP fue y sigue siendo definido por el VALOR.

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

(TMP*2)

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

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

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

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

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