Pregunta

En una pregunta de estilo de codificación sobre los bucles infinitos , algunas personas mencionaron que prefieren la para el estilo (;;) porque el estilo while (verdadero) muestra mensajes de advertencia en MSVC acerca de que una expresión condicional es constante.

Esto me sorprendió enormemente, ya que el uso de valores constantes en expresiones condicionales es una forma útil de evitar el infierno de #ifdef. Por ejemplo, puede tener en su encabezado:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif

Y el código puede simplemente usar un condicional y confiar en el compilador para que elide el código muerto cuando CONFIG_FOO no está definido:

if (foo_enabled) {
    ...
}

En lugar de tener que probar CONFIG_FOO cada vez que se usa foo_enabled:

#ifdef CONFIG_FOO
if (foo_enabled) {
    ...
}
#endif

Este patrón de diseño se usa todo el tiempo en el kernel de Linux (por ejemplo, include / linux / cpumask.h define varias macros a 1 o 0 cuando SMP está deshabilitado y a una llamada de función cuando SMP está habilitado).

¿Cuál es la razón de esa advertencia de MSVC? Además, ¿hay una mejor manera de evitar #ifdef hell sin tener que deshabilitar esa advertencia? ¿O es una advertencia demasiado amplia que no debería estar habilitada en general?

¿Fue útil?

Solución

Una advertencia no significa automáticamente que el código es malo , solo parece sospechoso.

Personalmente, comienzo desde la posición de habilitar todas las advertencias que puedo, luego desactivo las que sean más molestas que útiles. Aquel que dispara cada vez que le lanzas algo a un bool generalmente es el primero en irse.

Otros consejos

Creo que el motivo de la advertencia es que es posible que, sin darse cuenta, tenga una expresión más compleja que se evalúe como constante sin darse cuenta. Supongamos que tiene una declaración como esta en un encabezado:

const int x = 0;

luego más adelante, lejos de la declaración de x, tiene una condición como:

if (x != 0) ...

Es posible que no note que es una expresión constante.

Creo que es para atrapar cosas como

 if( x=0 )

cuando quisiste decir

 if( x==0 )

Una forma sencilla de evitar la advertencia sería:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
extern int foo_enabled = 0;
#endif
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top