c++ - una - Valor constante en la expresión condicional
variable en programacion (4)
En una pregunta de estilo de codificación sobre bucles infinitos , algunas personas mencionaron que prefieren el estilo para (;;) porque el estilo while (verdadero) proporciona mensajes de advertencia en MSVC sobre una expresión condicional que es constante.
Esto me sorprendió mucho, ya que el uso de valores constantes en expresiones condicionales es una forma útil de evitar el infierno #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 eludir 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 utiliza 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 en 1 o 0 cuando SMP está deshabilitado y en una llamada de función cuando SMP está habilitado).
¿Cuál es el motivo de esa advertencia de MSVC? Además, ¿hay una mejor manera de evitar el infierno #ifdef sin tener que desactivar esa advertencia? ¿O es una advertencia demasiado amplia que no debería ser habilitada en general?
Creo que el motivo de la advertencia es que, inadvertidamente, podrías tener una expresión más compleja que se evalúe como una constante sin darte 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, tienes una condición como:
if (x != 0) ...
Puede que no notes que es una expresión constante.
Creo que es para atrapar cosas como
if( x=0 )
cuando te referías
if( x==0 )
Una advertencia no significa automáticamente que el código es malo , solo de apariencia sospechosa.
Personalmente, empiezo desde una posición de habilitar todas las advertencias que puedo, y luego apago cualquiera que resulte más molesto que útil. Esa que dispara cada vez que lanzas algo a un bool suele ser la primera en desaparecer.
Una forma simple de evitar la advertencia sería:
#ifdef CONFIG_FOO
extern int foo_enabled;
#else
extern int foo_enabled = 0;
#endif