Errores, fallos, preguntas - página 2864

 
Andrey Khatimlianskii:

Entonces, ¿por qué no funciona?

Lo más probable es que este enfoque no funcione en ningún sitio. Porque hay una sustitución en la que el VALOR de la derecha es indefinido.

#define  VALUE (VALUE*2)
 
fxsaber:

Este enfoque probablemente no funcione en ningún sitio. Como hay una sustitución en marcha donde el VALOR de la derecha es indefinido.

Y es malo cambiar la macro-sustitución de otra persona. Más aún si se trata de macros de entorno predefinidas. No importa en qué lugar del final estará la macro de anulación, después de que todos los archivos del proyecto estén ensamblados. Es mejor definir su propia macro _VALUE.
 
Vladimir Simakov:
Sí, y es malo cambiar la macro-sustitución de otra persona.

Sin este mal , no habría ocurrido.

 
Vladimir Simakov:
Y es malo cambiar la macro-sustitución de otra persona. Sobre todo si son macros de entorno predefinidas. No importa dónde al final, después de que todos los archivos del proyecto se ensamblan, la anulación de la macro va a terminar. Será mejor que defina su propia macro _VALUE.
¿Puedo preguntar por qué no se puede utilizar la asignación de valor VALUE a una variable global y multiplicarla y sustituirla en la definición final?
 
Valeriy Yastremskiy:
¿Puedo preguntar por qué no se puede utilizar una asignación de VALOR a una variable global y multiplicarla y sustituirla en la definición final?

Se puede, pero entonces se pierde el sentido de la sustitución de macros (sustituir valores en el código). Toda la esperanza queda en el compilador, que convierte el tipo const (por cierto, ¿has definido el tipo de la variable?) a tipo constexpr de c++

Pero por lo demás, sí, se puede.

#ifdef  MACROS
   const int gValue=2*VALUE;
   #undef  VALUE
   #define  VALUE gValue
#endif
 
Vladimir Simakov:

Pero entonces, sí, se puede.

No funcionará con eso.

void Func( int = VALUE ) {}
 
fxsaber:

No funcionará con este.

Bien. Una vez más, pidamos a constexpr que lo haga así
constexpr auto x = 100;

void Foo(int _x = x) {
    std::cout << _x<<std::endl;
}

int main() {
    Foo();
    return 0;
}
 
fxsaber:

Este enfoque probablemente no funcione en ningún sitio. Como hay una sustitución de este tipo, donde el VALOR de la derecha no está definido.

Al parecer, no entiendo en absoluto cómo funciona el compilador. 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
 
Andrey Khatimlianskii:

Al parecer, no entiendo en absoluto cómo funciona el compilador. Imaginé que las cadenas se analizan secuencialmente. Así que no hay ningún valor indefinido a la derecha:

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

 
Andrey Khatimlianskii:

Al parecer, no entiendo en absoluto cómo funciona el compilador. Imaginé que las cadenas se analizan secuencialmente. Así que no hay ningún valor indefinido a la derecha:

No es el compilador - es el preprocesador)

#define  VALUE (TMP*2)

se convierte en

#define  VALUE (VALUE*2)

y su VALOR es indefinido.