zl_123 发表于 2013-4-8 20:43:19

“#if 0/#if 1 ... #endif”的作用

本帖最后由 zl_123 于 2013-4-8 20:44 编辑

今看到一帖子,讨论“#if 0/#if 1 ... #endif”的作用,感觉不错,故拿来分享。
原帖地址:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=2028608&bbs_page_no=1005&bbs_id=9999

1、先说“#if 0/#if 1 ... #endif”的作用,楼上诸位或多或少都说到了一点,但都没有说到关键的地方。我们知道,C标准不提供C++里的“//”这样的单行风格注释而只提供“”这样的块注释功能,我们通常使用它写代码中说明性的注释文字(注释作用)以及在调试时关闭某段代码对编译器的可见性(屏蔽作用),当然,这里所谓的“注释作用”和“屏蔽作用”是我们从功能上下的主观定义,对预处理器而言,两者并无任何区别。对于前者,因为“注释”中不会再出现“注释”和“需要屏蔽的代码段”,所以不会有嵌套的需求,所以通常不会有问题;而对于后者,当我们在调试程序时需要“屏蔽”某段代码时,该段代码中可能包含着前述的“注释”和/或“已被屏蔽的代码段”,这时就产生了“”嵌套使用的需求,但SB的C标准恰恰不允许我们这么干。当你试图使用嵌套的块注释功能时,会发现预处理器把最外层注释的开始和最内层注释的结尾这两者之间的内容处理成了注释,而其后一直到最外层注释结尾的内容被当作了“有效代码”——这显然会引起若干语法错误而导致编译中止。高手们开动脑筋想到了“#if 0 ... #endif”,它同样由预处理器进行处理,同样可以“屏蔽”一段代码,你想把说明文字写在里面也可以,这些和“”都一样,但不一样的是:第一它允许嵌套(层数上限由预处理器决定)、第二你随时可以把“#if 0”改成“#if 1”来取消对某段代码的“屏蔽”——很卓越的特性,快抛弃笨拙的“”吧!它唯一的缺点就是在编辑器中没有“注释”该有的文本显示样式。
(个人简单说明:
利用                     #if 0
                            #endif
可以屏蔽代码段,常用于嵌套注释;
若要恢复程序段,把0改成1即可,因此也方便了调试)

jlhgold 发表于 2013-4-9 07:26:35

好方法,之前没接触过,学习了!

boming 发表于 2013-4-9 07:33:12

顶。见过这样的用法。但自己没想到可以这样用。

mhw 发表于 2013-4-9 10:33:40

//下面这行是"//*"则不屏蔽代码;去掉一个斜杠改为“/*”则把代码注释掉:
//*
fun1()
{
}
fun2()
{
}
//*/

mhw 发表于 2013-4-9 10:35:17

实际上,注释比#if 0友好很多……因为一般编辑器都有语法高亮功能,注释掉就变成其他颜色了;而#if 0不会变颜色,导致阅读代码比较困难

monkerman 发表于 2013-4-9 10:41:44

本帖最后由 monkerman 于 2013-4-9 10:52 编辑

在 Eclipse/CCS 下, #if0 是会变色的. 整块都灰色了.{:lol:}
其他的编辑器也有这功能. 如 Vim, Sourceinsight.   
有时候这么用.#define   DEBUG   1/0
#if   DEBUG
.......
.......
#endif

jangel_lee 发表于 2013-4-9 10:44:36

这个方法不是很普遍么...一直都是这么屏蔽的...

jangel_lee 发表于 2013-4-9 10:46:24

调试的时候经常是
#if DEBUG
....
#else
...
#endif

DEBUG为1测试第一部分,反之第二部分

117433525 发表于 2013-4-9 10:52:27

有经常这么用,但维一不爽的就是代码颜色不会变很不方便。

jangel_lee 发表于 2013-4-9 11:27:54

表示source insight会变色

eduhf_123 发表于 2013-4-9 11:48:34

过去看了下“原帖”才发现,原来LZ位的文字是原样引用的我的话呀,哈哈!
{:lol:}


不过当时的一些说法,比如这样的块注释在IDE中没有语法着色的问题,都已经过时了。

405254609 发表于 2013-4-26 20:30:56

学习了,以前没接触过这样的···小鸟

素侠堂主 发表于 2013-4-26 22:16:29

变色问题,用#if 0 这样,编译器应该会变色的吧,编辑器可能不变色

AIHHLI 发表于 2013-4-26 22:49:47

表示vim会变色。
应该不是很RZ的编辑器都会。

绿茶山人 发表于 2013-4-27 11:17:38

大段代码用过这种方法,小段代码还是用注释,习惯而已,不一定科学。
页: [1]
查看完整版本: “#if 0/#if 1 ... #endif”的作用