¿Qué hace #if 0?

8

Hoy comencé a usar MPLAB X para programar mis PIC, y encontré una plantilla de código, con múltiples archivos y puntos para completar el código. Antes tenía un solo archivo con mi código. En esta plantilla, donde se supone que debo poner mis bits de configuración, hay el siguiente texto:

/* TODO Fill in your config bits here.  Remove #if 0 to embed config words.   */

#if 0

/* General syntax for configuration word 1 - Check your device .h file
for an up to date listing of available macros.*/
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF);

/* If the device has multiple configuration words, the second macro defines
the second configuration word.  Again check your device .h file
for an up to date listing of available macros. */
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_OFF & BORV_19 & LVP_OFF);

#endif

Realmente no entiendo qué significa "Eliminar #if 0 para incrustar palabras de configuración". significa ... Esto es probablemente algo realmente simple. Intenté buscar en Google y buscar en el manual de compiladores, pero no obtuve ningún buen resultado. Por lo que puedo entender, el código entre #if 0 y #endif nunca se compila. ¿Qué significa esta inserción? ¿Tiene algo que ver con configurar los bits de configuración en el código vs. después?

varesa
fuente

Respuestas:

17

Para ampliar un poco en #if 0:
Es esencialmente un truco para permitir comentarios de varias líneas. El preprocesador, que se ejecuta antes que el compilador, eliminará todo entre #if 0 y el #endif correspondiente.

Una razón por la que se usa en lugar de los comentarios de estilo / * * / es que puede habilitar todo el bloque simplemente cambiándolo a "#if 1".

exscape
fuente
99
En particular, /* */no se anida, por lo que si rodea un gran bloque de código /* */que ya tiene un /* */comentario dentro, todo no se comentará correctamente. Sin embargo, un enfoque más limpio, para esta biblioteca, habría sido usar en #if defined EMBED_CONFIG_WORDSlugar de #if 0y luego (posiblemente en un archivo de configuración separado o algo así) tener una línea como //#define EMBED_CONFIG_WORDScon un comentario que dice "descomentar esta línea para permitir la inclusión de palabras de configuración".
BlueRaja - Danny Pflughoeft
5

Por lo que puedo entender, el código entre #if 0 y #endif nunca se compila.

Si.

¿Qué significa esta inserción? ¿Tiene algo que ver con configurar los bits de configuración en el código vs. después?

Los bits de configuración son un registro programado especial en el PIC que determina el funcionamiento del oscilador, la detección de oscurecimiento, + otras cosas. De uno de los manuales de referencia : (la macro __CONFIG en C se asigna a la directiva correspondiente en el ensamblaje)

Directiva CONFIG de MPASM

El ensamblador de Microchip, MPASM, tiene una buena característica que le permite especificar, en el archivo de código fuente, los estados seleccionados de los bits de configuración para este programa. Esto garantiza que, al programar un dispositivo para una aplicación, también se programe la configuración requerida. Esto minimiza el riesgo de programar la configuración incorrecta del dispositivo y se pregunta por qué ya no funciona en la aplicación.

Jason S
fuente
3

Tiene toda la razón, el código entre #if 0 / # endif nunca se compila. Es otra forma de comentar un bloque de código.

La eliminación del endif #if 0 / # incluirá las macros __CONFIG que habilitarán esos bits en los bits de configuración del PIC.

Jim A
fuente