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?
c-preprocessor
vette982
fuente
fuente
//
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.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.
fuente
Es idéntico a comentar el bloque, excepto con una diferencia importante: el anidamiento no es un problema. Considere este código:
Si quiero comentarlo, puedo intentar:
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 labaz
llamada no esté comentada y*/
despuésbaz
un error de sintaxis. Por otra parte:Funciona para comentar todo. Y los
#if 0
s anidarán entre sí, así:Aunque, por supuesto, esto puede resultar un poco confuso y convertirse en un dolor de cabeza de mantenimiento si no se comenta correctamente.
fuente
foo.c:3: unterminated string or character constant
de gcc, ¿qué estás usando?Comenta permanentemente ese código para que el compilador nunca lo compile.
El codificador puede luego cambiar el #ifdef para que ese código se compile en el programa si así lo desea.
Es exactamente como si el código no existiera.
fuente
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 ...
fuente
Me gustaría agregar para el
#else
caso:fuente
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.
fuente
#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
: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.
fuente
No exactamente
Muestra "tc: 4: 19: advertencia: falta el carácter de terminación" con gcc 4.2.4
fuente
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:
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.
fuente