¿Qué hace #if 0?

Hoy comencé a usar MPLAB X para programar mis PIC y encontré una plantilla de código, con varios archivos y lugares para completar el código. Antes he tenido un solo archivo con mi código en él. 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 lo que significa "Eliminar #si 0 para incrustar palabras de configuración". significa... Esto es probablemente algo realmente simple. Intenté buscar en Google y buscar en el manual del compilador, pero no obtuve buenos resultados. 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 y luego?

Respuestas (3)

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

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

En particular, /* */no 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 #if defined EMBED_CONFIG_WORDSen lugar 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 diga "descomenta esta línea para habilitar la incrustación de palabras de configuración".

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

Sí.

¿Qué significa esta inserción? ¿Tiene algo que ver con configurar los bits de configuración en el código y luego?

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

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 asegura que al programar un dispositivo para una aplicación también se programe la configuración requerida. Esto minimiza el riesgo de programar una configuración de dispositivo incorrecta y preguntarse por qué ya no funciona en la aplicación.

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

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