Errores, fallos, preguntas - página 2025

 

Doble error de ejecución

#define  XY( X, Y )      X##Y
#define  f( X )  XY( g, X )
#define  MACRO1( X )     #X
#define  MACRO2( X )     MACRO1( X )
#define  SIZE    5
void OnStart()
{
    printf( "%s", MACRO2( f( SIZE )));
}

Resultado: f(SIZE)

Debería ser: g5

 
leonerd:

¿Cómo puedo eliminar las flechas del gráfico de visualización de pruebas? Empiezo a probar y todavía hay flechas y líneas de entradas de la última prueba.

Limpia la plantilla tester.tpl, probablemente los objetos estén ahí.

 
A100:

Doble error de ejecución

Resultado: f(SIZE).

Debería ser: g5


Me parece un resultado lógico.

 
fxsaber:
Me parece un resultado lógico.

Esperado: Primero sustitución de la macro interna SIZE, luego la macro intermedia f( X ) y finalmente la macro externa MACRO2( X )

Pero el resultado es diferente incluso si se utiliza una lógica incompleta:

#define  MACRO1( X )     #X
void OnStart()
{
    printf( "%s", MACRO1( f( SIZE )));
}
//Результат  :f(SIZE)
//должен быть:f( SIZE )

Al menos la diferencia está en los espacios

 
A100:

Esperado: Primero sustitución de la macro interna SIZE, luego la macro intermedia f( X ) y finalmente la macro externa MACRO2( X )

Pero el resultado es diferente incluso si se utiliza una lógica incompleta:

Al menos la diferencia está en los espacios en blanco

La prioridad de las funciones es, por supuesto, de dentro a fuera. En cambio, con las macros es al revés.

#X es una cadena sin espacios. Uno puede estar en desacuerdo con esto, por supuesto.

 
fxsaber:

La prioridad de las funciones es, por supuesto, de adentro hacia afuera. Las macros, en cambio, lo tienen al revés.

#X es una cadena sin espacios. Puedes estar en desacuerdo con esto, por supuesto.

Pero, ¿por qué debemos inventar nuevas reglas complicadas con una notación antigua cuando ya existen reglas antiguas y sencillas con esa notación, conocidas por un amplio círculo de personas y establecidas desde hace décadas? Si las normas son nuevas, las designaciones también deben serlo

 
A100:

Doble error de ejecución

Resultado: f(SIZE)

Debería ser: g5

Envié una solicitud similar al servicio de atención al cliente hace un año (#1600034), y todavía no se ha respondido. Parece que no se preocupan por todos estos bichos "raros". Y en general, la lengua no tiene intención de mejorar, a juzgar por todos. Sólo se arreglan los errores más importantes, y nada más.
 
A100:

¿Por qué inventar normas nuevas y complicadas con denominaciones antiguas cuando ya existen normas antiguas y sencillas con esas denominaciones, conocidas por un amplio número de personas y establecidas durante décadas? Si las normas son nuevas, las designaciones también deberían serlo.

¿De qué estamos hablando exactamente? ¿Cómo debería ser?

 
fxsaber:

¿De qué estamos hablando exactamente? ¿Y cómo debería ser?

#X es la cadena tal cual, es decir, con espacios (si los hay). Y ver el ejemplo anterior de f( SIZE ) -> g5. Estas reglas no las he inventado yo - así es como lo hacen los compiladores de C++

 
Alexey Navoykov:
Envié una solicitud similar al servicio de atención al cliente hace un año (#1600034), y aún no he recibido respuesta. Parece que no se preocupan por todos estos bichos "raros". Y en general, la lengua no tiene intención de mejorar, a juzgar por todos. Sólo arreglan los errores más importantes, nada más.

Me encontré con esto por accidente ayer y me sorprendió cómo en conjunto con

template<typename T, int n>

Varias decenas de líneas de código se han convertido literalmente en una o dos (¡!). Por eso lo escribí: a primera vista puede parecer una nimiedad. Una vez más me convenzo de que en C++ no hay tonterías