为什么我们不能在另一条评论中嵌入一条评论?

时间:2016-02-11 20:01:09

标签: c syntax comments

/*
/**hiiii**/
*/

说我像这样嵌套评论,所以这有什么问题?在开始时我们有/*然后在其中有一些字符串然后我们最后有*/,那么这里的错误是什么?

6 个答案:

答案 0 :(得分:6)

C标准非常明确。 /*...*/样式注释未嵌套,因为语言语法不允许嵌套

引用C11,第6.4.9章,评论,(强调我的

  

字符常量,字符串文字,或注释外,字符/*   发表评论。检查此类评论的内容仅用于识别   多字节字符并找到终止它的字符*/ 83)

和相关的脚注

  

83)因此,/* ... */条评论不会嵌套。

详细说明,如你所述,

/*                  <-- Comments starts here
/**hiiii**/         <-- Found the ending */, so comment ends.
*/                  <-- problem here....
  • 在第一行中,/*开始发表评论。
  • 在第二行开始/* 不会启动评论,如前所述。
  • 在第二行结尾处,*/终止评论。因此,在第三行中,*/会产生错误。

答案 1 :(得分:4)

  
    

为什么我们不能在另一条评论中嵌入一条评论?

  

因为语言设计者对语言实现者表示同情。

解析不可用的评论非常容易;解析可嵌套的注释有点不太容易。

// pseudo code for unnestable comments
is the character a '*'? YES => Is the next one a '/'? YES END COMMENTS
else STILL INSIDE A COMMENT

答案 2 :(得分:3)

代码可以有效struct嵌套评论行为。因此,不需要扩展#if 0行为。

/* */

答案 3 :(得分:1)

/**hiiii**/行末尾的* /结束了评论。

这样做:

/*
//*Hiiii*
*/

答案 4 :(得分:1)

看到/*编译器查找*/后。一旦发现评论更接近*/,就完成了。从/*到第一*/的所有内容都被视为评论。所以,

/*
/**hiiii**/ 

发表评论。

第二个*/没有先前/*,因此会导致错误。

答案 5 :(得分:0)

/*引入的C评论不会嵌套。这个决定是由40多年前的原始设计师做出的,所有C标准都强制要求。虽然一些较旧的编译器支持使用命令行开关嵌套此类注释,但强烈建议遵循标准实践并考虑注释在第一次出现的字符*/时结束。

请注意,/*可以通过转义的换行符分隔(\后跟换行符:

int i = 3;  /\
* This is a comment (SO syntax coloring is not perfect ;-) *\
/ printf("%d\n", i); // prints 3

另请注意,通过将代码转换为/* */的评论来评论代码是一个坏主意。如果您的代码包含C注释,则会失败,甚至可能无声地失败:

int i = 3, j = 6;
/* printf("debug: i=%d\n", i);  /* check the value of i */
printf("debug: j=%d\n", j);  // check the value of j */

在上面的代码中,第二个printf评论

你可以想象更棘手的情况:

/*
// list all C source files in subdirectories
system("ls */*.[ch]");
*/

有两种有效的方法来评论代码块:

  • 使用#if 0 / #endif预处理程序指令。通过将#if 0更改为#if 1,可以嵌套并轻松取消注释

  • 在块中每行的开头插入//。这可以是嵌套,通过在每行的开头插入//,可以评论更大的块。