Что делает #if 0

8

Сегодня я начал использовать MPLAB X для программирования своих PIC и нашел шаблон кода с несколькими файлами и местами для заполнения кода. Раньше у меня был один файл с моим кодом. В этом шаблоне, куда я должен положить свои биты конфигурации, есть следующий текст:

/* 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

Я не очень понимаю, что такое "Удалить #if 0 для встраивания слов конфигурации". значит ... это возможно что-то действительно простое. Я попытался поискать в Google и искал руководство по компиляторам, но не получил хороших результатов. Из того, что я могу понять, код между #if 0 и #endif никогда не компилируется. Что означает это встраивание? Имеет ли это какое-то отношение к установке битов конфигурации в коде и после?

varesa
источник

Ответы:

17

Чтобы немного расширить #if 0:
это по сути хак, чтобы разрешить многострочные комментарии. Препроцессор, который запускается раньше, чем компилятор, удалит все между #if 0 и соответствующим #endif.

Одна из причин, по которой он используется вместо комментариев в стиле / * * /, заключается в том, что вы можете включить весь блок, просто изменив его на "#if 1".

exscape
источник
9
В частности, /* */не является вложенным, поэтому, если вы окружите большой блок кода, в /* */котором уже есть /* */комментарий, все это не будет правильно закомментировано. Более чистый подход для этой библиотеки заключался бы в использовании #if defined EMBED_CONFIG_WORDSвместо, #if 0а затем (возможно, в отдельном конфигурационном файле или что-то в этом роде) строки, например //#define EMBED_CONFIG_WORDSс комментарием: «раскомментируйте эту строку, чтобы включить вложение слов конфигурации».
BlueRaja - Дэнни Пфлюгофт
5

Из того, что я могу понять, код между #if 0 и #endif никогда не компилируется.

Да.

Что означает это встраивание? Имеет ли это какое-то отношение к установке битов конфигурации в коде и после?

Конфигурационные биты - это специальный запрограммированный регистр в PIC, который определяет работу генератора, обнаружение отключения и другие вещи. Из одного из справочных руководств : (макрос __CONFIG в C соответствует соответствующей директиве в сборке)

Директива MPASM CONFIG

Ассемблер Microchip, MPASM, имеет замечательную функцию, которая позволяет вам указать в файле исходного кода выбранные состояния битов конфигурации для этой программы. Это гарантирует, что при программировании устройства для приложения также будет запрограммирована необходимая конфигурация. Это сводит к минимуму риск программирования неправильной конфигурации устройства и удивляет, почему оно больше не работает в приложении.

Джейсон С
источник
3

Вы совершенно правы, код между #if 0 / # endif никогда не компилируется. Это еще один способ закомментировать блок кода.

Удаление #if 0 / # endif будет включать макросы __CONFIG, которые активируют эти биты в битах конфигурации PIC.

Джим А
источник