/*
/**hiiii**/
*/
说我像这样嵌套评论,所以这有什么问题?在开始时我们有/*
然后在其中有一些字符串然后我们最后有*/
,那么这里的错误是什么?
答案 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
,可以嵌套并轻松取消注释。
在块中每行的开头插入//
。这可以是嵌套,通过在每行的开头插入//
,可以评论更大的块。