O que #if 0 faz

8

Hoje comecei a usar o MPLAB X para programar meus PICs e encontrei um modelo de código, com vários arquivos e pontos para preencher o código. Antes eu tinha um único arquivo com o meu código. Neste modelo, onde devo colocar meus bits de configuração, há o seguinte 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

Eu realmente não entendo o que o "Remover #if 0 para incorporar palavras de configuração". significa ... Isso é provavelmente algo realmente simples. Tentei pesquisar no Google e pesquisar no manual dos compiladores, mas não obtive bons resultados. Pelo que entendi, o código entre #if 0 e #endif nunca é compilado. O que essa incorporação significa? Isso tem algo a ver com definir os bits de configuração no código vs. depois?

varesa
fonte

Respostas:

17

Para expandir um pouco o #if 0:
é essencialmente um truque permitir comentários de várias linhas. O pré-processador, que é executado antes do compilador, removerá tudo entre #if 0 e o #endif correspondente.

Um motivo pelo qual é usado em vez de / * * / style comments é que você pode ativar o bloco inteiro simplesmente alterando-o para "#if 1".

exscape
fonte
9
Em particular, /* */não aninha, portanto, se você envolver um grande bloco de código com /* */um /* */comentário, a coisa toda não será comentada corretamente. Uma abordagem mais limpa, porém, para esta biblioteca, seria usar em #if defined EMBED_CONFIG_WORDSvez de #if 0e, em seguida (possivelmente em um arquivo de configuração separado ou algo assim), ter uma linha como //#define EMBED_CONFIG_WORDScom um comentário dizendo "descomente esta linha para permitir a incorporação de palavras de configuração".
BlueRaja - Danny Pflughoeft 03/03
5

Pelo que entendi, o código entre #if 0 e #endif nunca é compilado.

Sim.

O que essa incorporação significa? Isso tem algo a ver com definir os bits de configuração no código vs. depois?

Os bits de configuração são um registro programado especial no PIC que determina a operação do oscilador, detecção de queda de energia, + outras coisas. Em um dos manuais de referência : (a macro __CONFIG em C é mapeada para a diretiva correspondente na montagem)

Diretiva CONFIG do MPASM

O montador do Microchip, MPASM, possui um bom recurso que permite especificar, no arquivo de código-fonte, os estados selecionados dos bits de configuração para este programa. Isso garante que, ao programar um dispositivo para um aplicativo, a configuração necessária também seja programada. Isso minimiza o risco de programar a configuração incorreta do dispositivo e se perguntar por que não funciona mais no aplicativo.

Jason S
fonte
3

Você está exatamente certo, o código entre o #if 0 / # endif nunca é compilado. É outra maneira de comentar um bloco de código.

A remoção do #if 0 / # endif incluirá as macros __CONFIG, que permitirão esses bits nos bits de configuração do PIC.

Jim A
fonte