/*
/**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
来轻松取消注释。在块中每行的开头插入
//
。 这可以嵌套,也就是说,您可以通过在每行的开头再次插入//
来注释更大的块。