C - 为什么我们不能将一个评论嵌套在另一个评论中?


/*
/**hiiii**/
*/

假设我像这样嵌套评论,那么这有什么问题呢?一开始我们有/*,然后里面有一些字符串,最后我们有最后的*/,那么这里的错误是什么?

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

引用C11,第 6.4.9 章,注释,(强调我的(

除了字符常量、字符串文本或注释之外,字符/* 引入评论。检查此类评论的内容只是为了确定 多字节字符,并查找终止它的字符*/83(

以及相关的脚注,

83(因此,/* ... */评论不嵌套。

详细说明,就像你的情况一样,

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

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

因为语言设计者怜悯语言实现者。

解析

不可嵌套的注释非常容易;解析可嵌套的注释则不太容易。

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

代码可以有效地具有嵌套注释行为与#if 0。 因此,不需要扩展/* */行为。

#if 0
   blah blah 
#if 0
   blah blah 
#endif
   blah blah 
#endif

/**hiiii**/行末尾的 */正在结束注释。

这样做:

/*
//*Hiiii*
*/

看到/*编译器后查找*/ .一旦它找到更近的评论 */ ,一切都完成了。从/*到第一个*/都被视为评论。所以

/*
/**hiiii**/ 

发表评论。

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

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

请注意,/* 可以用转义换行符(后跟换行符(分隔:

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

另请注意,通过将代码转换为带有 /* */ 的注释来注释代码是一个坏主意。 如果你的代码包含 C 注释,这将失败,甚至可能以静默方式失败:

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

在上面的代码中,没有注释第二个printf

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

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

有效的方法可以注释代码块:

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

  • 在块中每行的开头插入//。 这可以嵌套,也就是说,您可以通过在每行的开头再次插入//注释更大的块。

最新更新