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

问题描述:

/* 
/**hiiii**/ 
*/ 

说我喜欢这样的评论,那么这有什么问题?在开始时,我们有/*,然后在它里面有一些字符串,最后我们在末尾*/,那么这里有什么错误?为什么我们不能在另一条评论中嵌套一条评论?

+1

评论停止一旦他们看到* /的匹配结束,如果你想要一个嵌套注释只是使用//里面,而不是。 –

+1

要暂时禁用包含注释的代码部分,请使用'#if 0'。某些IDE提供的替代方案是一个快捷键,它将通过在每行开始处插入一个'//'来将一段代码转换为注释。 – user3386109

+0

'a = 42; //外部注释//内部嵌套注释:)' – pmg

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

引用C11,章6.4.9,评论,(重点煤矿

除了内的字符常量,字符串文字,或注释,人物/* 介绍评论。此类评论的内容仅用于识别 多字节字符,并查找终止它的字符*/83)

,并在相关脚注,

83)因此,/* ... */注释不嵌套。

要详细描述,当你的情况,

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

这并不回答为什么不可以在C中使用嵌套注释。 –

+0

@VladfromMoscow抱歉,先生,没有得到你。任何我错过的东西? –

+0

@VladfromMoscow“因为”这就是语言的定义方式。这种行为比C11早了一点;我似乎记得C86以这种方式工作,这在我学习时很新颖。 –

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

这样做:

/* 
//*Hiiii* 
*/ 

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

/* 
/**hiiii**/ 

发表评论。

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

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

因为语言设计者对语言实现者感到可惜。

解析不可理解的评论是非常容易的;分析可嵌套的评论不太容易。

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

嵌套注释的伪代码:'inside_comment = 0; if(“/ *”)inside_comment ++; if(“* /”)inside_comment - ;'所以零值意味着你不在评论中,正值表示你在评论中,而负值是错误。 – user3386109

+1

@ user3386109:我没有说这很难:) – pmg

代码可以有效嵌套评论的行为与#if 0。因此不需要延伸/* */行为。

#if 0 

    blah blah 

#if 0 
    blah blah 

#endif 

    blah blah 

#endif 

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来嵌套并且容易地将取消注释

  • 插入//在块中的每一行的开头。这可能是嵌套,是感觉,你可以评论再次在每一行的开头插入//较大的块。