Hu Zhenyu's Blog


访客计数:
net traffic statistics

about

C语言中的注释嵌套

很多学过其他编程语言的人可能会用到这么个技巧,那就是把一段暂时不需要的程序“注释”掉。我一开始用C语言的时候 ,遇到暂时不用的代码时就是把他们放在//之间。
可是当你用C语言的时候就得注意了。
C语言的编译器 ,有的支持注释嵌套 ,有些不支持注释嵌套 。怎么回事呢?

假如有以下一段程序

int program()  
{    
    /*  
    do_one();  
    /*  
    This is an annotation!  
    */  
do_two();  
*/  
return 0;  
}  

如果编译器支持 注释嵌套, 则 程序就成了

int program()  
{  
return 0;  
}   如果不支持注释嵌套, 编译器会认为 注释在 do_two();前面就已经结束了 而把后面的当作语句 。这时就可能出现错误。  

那么如果在C语言中想要“注释掉”一大段程序 怎么办呢?
方法如下

#ifdef 0  
do_something();  
#endif  

这样把代码放到 #ifdef 和 #endif 之间。

在《C陷阱与缺陷》一书中还提了一个有意思的问题,如何写出一个程序 让它既能在支持注释嵌套的编译器下运行,也能在不支持注释嵌套的编译器下运行。
下面是几个解: (可以自己先想一下怎么做 再看答案哦)

/*/**/"*/"/*"/**/

这样,如果允许嵌套注释,上面的表达式就等效于"*/";如果不允许,那么就等效于"*/"?  
  
/*/*/0*/**/1?  
如果编译器允许嵌套注释,则上式将被解释为:

/* /* /0 */ * */ 1

两个/*符号与两个*/符号正好匹配,所以上市的值就是1。如果不允许嵌套注释,竖直中的/*将被忽略。因此,即使是/出现在注释中也没有特殊的含义;上面的表达式因此将被这样解释:

/* / */ 0* /**/

它的值就是0*1,也就是0
上一篇: [转]有什么办法可以用Windows?
下一篇: 写自己的头文件 ——C语言的多文件编译


知识共享许可协议

本站采用 知识共享署名-非商业性使用-相同方式共享3.0 中国大陆许可协议 进行许可,转载请注明出处。

推荐使用 chrome 浏览器浏览本站。