C编译器的注释嵌套

本博客详细解释:《C陷阱与缺陷》课后习题1-1,题目:

     某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译,但是这两种情况下程序执行的结果却不同。

首先,要说明的是C90只有一种注释风格,就是使用“/*”和“*/”,是没有//注释符号的。在预处理阶段,C预处理器会剔除所有出现在“/*”和“*/”之间的内容(包括这对记号本身),所以在接下来传送到C编译器的代码文件里是不会出现任何注释内容的。

下面说明什么是嵌套注释:
什么是注释呢?注释就是写什么东西都无所谓,反正编译器不会看到这些东西。很不幸,C预处理器一般都不支持嵌套注释,如果你这样写:

       /*one /* two */*/

 是行不通的。因为预处理器在碰到第一个“*/”时就认为注释已经结束!于是它把到这里为止的注释移除,可想而知,结果留下孤零零一个“*/”—编译程序又报错了。

但是,同样一段代码,对于支持嵌套注释的的编译器而言,结果为都注释掉。因为在two前面的/*会先匹配two后面的*/,one前面的/*匹配最后的*/(目测它与if,else语句的嵌套一样,就近原则)

好了,知道了什么是嵌套注释,让我们通过一个例子来继续深入的理解嵌套注释:

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

对于不支持嵌套注释的编译器而言:会将该代码分为/*/**/,  "*/",  /**/三个部分,最后的结果是"*/";

对于支持嵌套注释的编译器而言:会将该代码分为/*/**/"*/,  "/*",  /**/三个部分,最后结果是"/*"。

 

对于习题1-1,我们可以通过下面的代码来检测编译器是否支持嵌套注释,具体代目如下:

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int ans = /*/*/0*/**/1;
    printf("%d\n", ans);

    return 0;
}
/*/*/0*/**/1为 Doug McIlroy 发现,若编译器支持嵌套注释,则ans = 1;否则为0

 

参考博客:http://www.cppblog.com/Tim/archive/2011/03/25/142726.html

               http://hi.baidu.com/iexinyu/item/27dfdbd313f287392a35c77f

 

 

posted on 2012-08-13 18:07  asfion  阅读(2684)  评论(0编辑  收藏  举报

导航