#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之间的代码永远不会被编译。嵌入是什么意思?它与在代码中设置配置位有关,与之后有关吗?

Answers:


17

在#if 0上稍加扩展:
本质上是允许多行注释的一种技巧。在编译器之前运行的预处理器将删除#if 0和匹配的#endif之间的所有内容。

使用它而不是/ * * /样式注释的原因之一是,只需将其更改为“ #if 1”就可以启用整个块。


9
特别是,/* */它不会嵌套,因此,如果您在/* */其中包含/* */注释的大代码块周围,整个事情将无法正确注释掉。但是,对于该库,一种更干净的方法是使用#if defined EMBED_CONFIG_WORDS代替,#if 0然后(可能在单独的配置文件中或其他内容中)有一行,//#define EMBED_CONFIG_WORDS并带有注释,说“取消注释此行以启用配置字的嵌入”。
BlueRaja-Danny Pflughoeft 2012年

5

据我了解,#if 0和#endif之间的代码永远不会被编译。

是。

嵌入是什么意思?它与在代码中设置配置位有关,与之后有关吗?

Config位是PIC中的一个特殊编程寄存器,用于确定振荡器的操作,掉电检测以及其他情况。从其中的一本参考手册中:(C中的__CONFIG宏映射到汇编中的相应指令)

MPASM的CONFIG指令

Microchip的汇编器MPASM具有很好的功能,使您可以在源代码文件中指定该程序的配置位的选定状态。这样可确保在为应用程序对设备进行编程时,也可以对所需的配置进行编程。这样可以最大程度地减少对错误的设备配置进行编程的风险,并想知道为什么它在应用程序中不再起作用。


3

完全正确,永远不会编译#if 0 /#endif之间的代码。这是注释掉一段代码的另一种方法。

删除#if 0 /#endif将包括__CONFIG宏,这些宏将启用PIC配置位中的那些位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.