Por lo general, trato de evitar el uso excesivo de la compilación condicional cuando sea posible.
Por un lado, por lo general es feo y menos legible.
Pero aún más importante, cuando los proyectos usan la compilación condicional para desactivar el código de depuración en &, a veces me he encontrado con problemas de que el código de depuración se queda obsoleto cuando está deshabilitado. Luego, cuando realmente quiera usar el código de depuración, lo enciendo y ... Cosas. No lo hagas Construir. Nunca más.
El código de depuración puede hacer referencia a variables o funciones que ya no existen, o cosas por el código de depuración latentes han cambiado lo suficiente de lo contrario eso es simplemente no es válido sintácticamente más.
Puede ser realmente irritante.
Así que, en lo personal, he evitado la compilación condicional para habilitar/deshabilitar el código de depuración a favor de utilizar una enumeración o macro (que todavía está compilada condicionalmente) para usar como condición en una declaración if
. Cuando se compila como if (0)
, no se genera código de tiempo de ejecución, exactamente como se desee. Sin embargo, el código aún se compila y se comprueba la sintaxis, por lo que siempre es al menos sintácticamente correcto.
#if NDEBUG // using the same standard macro that `assert()` uses
// use your own if NDEBUG doesn't make sense
enum {
DebugOn = 0
}
#else
enum {
DebugOn = 1
}
#endif
// ... elsewhere
if (DebugOn) {
// this always gets compiled, but if it's a release build
// the compiler will not emit anything...
}
Como FryGuy mentioned, se puede combinar fácilmente esto con llamar a su MyFunction()
si se quiere - en una versión de lanzamiento, la función no será llamado debido a un cortocircuito, que es el comportamiento especificado:
if (DebugOn && MyFunction(expression)) {
// this always gets compiled, but if it's a release build
// the compiler will not emit anything...
}
Pero, personalmente, probablemente me utilizo
if (DebugOn) {
if (MyFunction(expression)) {
// ...
}
}
lo que creo que ayuda a llamar un poco más clara (sólo un poco) que este es un Debu bloque g-only.
Esto tiene la ventaja de estar siempre compilado y que no tiene control de flujo escondido detrás de macros (que varias otras respuestas han mencionado como un mal).
A no ser que se está compilando en su totalidad y sin optimizaciones, 'si (false) {código}' no ponga nada en la salida. –
Oh, pensé que los compiladores eran menos inteligentes que eso. Gracias – valerio
Como regla general, el compilador es más inteligente que usted. Quizás no ** tú **, pero ciertamente yo. –