En C / C ++
¿Qué sucede con el código colocado entre un bloque #if 0
/ #endif
?
#if 0
//Code goes here
#endif
¿El código simplemente se omite y, por lo tanto, no se ejecuta?
En C / C ++
¿Qué sucede con el código colocado entre un bloque #if 0
/ #endif
?
#if 0
//Code goes here
#endif
¿El código simplemente se omite y, por lo tanto, no se ejecuta?
Respuestas:
No solo no se ejecuta, ni siquiera se compila.
#if
es un comando de preprocesador, que se evalúa antes del paso de compilación real. El código dentro de ese bloque no aparece en el binario compilado.
A menudo se usa para eliminar temporalmente segmentos de código con la intención de volver a activarlos más tarde.
Es idéntico a comentar el bloque, excepto con una diferencia importante: el anidamiento no es un problema. Considere este código:
foo();
bar(x, y); /* x must not be NULL */
baz();
Si quiero comentarlo, puedo intentar:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt. ¡Error de sintaxis! ¿Por qué? Debido a que los comentarios de bloque no se anidan, por lo que (como puede ver en el resaltado de sintaxis de SO) */
después de la palabra "NULL" termina el comentario, lo que hace que la baz
llamada no esté comentada y */
después baz
un error de sintaxis. Por otra parte:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Funciona para comentar todo. Y los #if 0
s anidarán entre sí, así:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Aunque, por supuesto, esto puede resultar un poco confuso y convertirse en un dolor de cabeza de mantenimiento si no se comenta correctamente.
foo.c:3: unterminated string or character constant
de gcc, ¿qué estás usando?
¿Qué hace exactamente un bloque #if 0… #endif?
Le dice que el autor obviamente nunca ha oído hablar de un sistema de control de versiones. Lo que, a su vez, te dice que corras lo más lejos posible ...
Cuando el preprocesador ve #if, comprueba si el siguiente token tiene un valor distinto de cero. Si es así, conserva el código para el compilador. Si no es así, se deshace de ese código para que el compilador nunca lo vea.
Si alguien dice #if 0, efectivamente está comentando el código para que nunca se compile. Puedes pensar en esto de la misma manera que si hubieran puesto / * ... * / alrededor. No es exactamente lo mismo, pero tiene el mismo efecto.
Si desea comprender lo que sucedió en detalle, a menudo puede mirar. Muchos compiladores le permitirán ver los archivos después de que se haya ejecutado el preprocesador. Por ejemplo, en Visual C ++, el comando switch / P ejecutará el preprocesador y colocará los resultados en un archivo .i.
#if WIN32 || __CYGWIN__
pero funciona como se esperaba.
Las líneas que comienzan con a #
son directivas de preprocesador . #if 0 [...] #endif
los bloques no llegan al compilador y no generarán código de máquina.
Puede demostrar lo que sucede con el preprocesador con un archivo fuente ifdef.cxx
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
La ejecución gcc -E ifdef.cxx
le mostrará lo que se compila.
Puede optar por utilizar este mecanismo para evitar que se compile un bloque de código durante el ciclo de desarrollo, pero probablemente no desee registrarlo en su control de código fuente, ya que simplemente agrega cruft a su código y reduce la legibilidad. Si se trata de un código histórico que se ha comentado, entonces debería eliminarse: el control de código fuente contiene el historial, ¿verdad?
Además, la respuesta puede ser la misma para C y C ++, pero no existe un lenguaje llamado C / C ++ y no es un buen hábito referirse a dicho lenguaje.
No exactamente
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Muestra "tc: 4: 19: advertencia: falta el carácter de terminación" con gcc 4.2.4
Es una forma barata de comentar, pero sospecho que podría tener potencial de depuración. Por ejemplo, supongamos que tiene una compilación que genera valores en un archivo. Es posible que no desee eso en una versión final, por lo que puede usar #if 0 ... #endif.
Además, sospecho que una mejor manera de hacerlo con fines de depuración sería hacer:
#ifdef DEBUG
// output to file
#endif
Puede hacer algo así y podría tener más sentido y todo lo que tiene que hacer es definir DEBUG para ver los resultados.
//
o comenzar la sección con/*
y terminar la sección con*/
. El problema con las últimas técnicas es que los comentarios no se anidan, por lo que el desarrollador debe verificar y manejar cualquiera*/
entre el inicio y el final.