为什么我们不能在另一条评论中嵌套一条评论?
/*
/**hiiii**/
*/
说我喜欢这样的评论,那么这有什么问题?在开始时,我们有/*
,然后在它里面有一些字符串,最后我们在末尾*/
,那么这里有什么错误?为什么我们不能在另一条评论中嵌套一条评论?
C标准是非常明确了。 /*...*/
样式注释请勿嵌套,因为语言语法不允许嵌套。
引用C11
,章6.4.9,评论,(重点煤矿)
除了内的字符常量,字符串文字,或注释,人物
/*
介绍评论。此类评论的内容仅用于识别 多字节字符,并查找终止它的字符*/
。83)
,并在相关脚注,
83)因此,
/* ... */
注释不嵌套。
要详细描述,当你的情况,
/* <-- Comments starts here
/**hiiii**/ <-- Found the ending */, so comment ends.
*/ <-- problem here....
- 在第一行,
/*
开始评论。 - 在第二行起始
/*
不是开始新评论,如前所述。 - 在第二行结尾处,
*/
终止注释。所以,在第三行中,*/
会产生错误。
这并不回答为什么不可以在C中使用嵌套注释。 –
@VladfromMoscow抱歉,先生,没有得到你。任何我错过的东西? –
@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
嵌套注释的伪代码:'inside_comment = 0; if(“/ *”)inside_comment ++; if(“* /”)inside_comment - ;'所以零值意味着你不在评论中,正值表示你在评论中,而负值是错误。 – user3386109
@ 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
来嵌套并且容易地将取消注释。插入
//
在块中的每一行的开头。这可能是嵌套,是感觉,你可以评论再次在每一行的开头插入//
较大的块。
评论停止一旦他们看到* /的匹配结束,如果你想要一个嵌套注释只是使用//里面,而不是。 –
要暂时禁用包含注释的代码部分,请使用'#if 0'。某些IDE提供的替代方案是一个快捷键,它将通过在每行开始处插入一个'//'来将一段代码转换为注释。 – user3386109
'a = 42; //外部注释//内部嵌套注释:)' – pmg