主流的C/C++/Java/C#等语言,都将注释语法设计成不可嵌套的。
如: /* xxx /* yyy */ zzz */ 是非法的。
理由:
注释是用于写描述性语言的,嵌套会使得可读性更差。
但事实上,注释不只是用来写注释标注,还通常用于屏蔽代码块。需要注释掉一大段程序的时候,仍用这个注释符( /* … * /)好不好呢?
答案当然是:不好!!!
如果那段要注释的程序中已经有地方用这个注释符注释过的话,那么再这样注释就可能会出问题。有些编译器在检测到"/*" 会寻找最近的" */"与其结合。
那么该如何进行大段程序的注释呢?
C语言中有
#if 0
#endif
这样的语句可以完成这个任务。
这是预编译语句,编译器会自动识别这些预编译代码,判断if是否成立,如果成立,就把****1 代码留下,****2 代码注释掉,这是编译器完成的。这样就不会影响程序的编译和移植了,如:
#if 0
、
****1
/*..........*/
、
#else
、
****2
/*..........*/
、
#endif
问题来源:
《C陷阱与缺陷》
练习1-1.
某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对允许嵌套注释的编译器,海狮队不允许嵌套注释的编译器,该程序都能正常通过编译(无错误消息出现),但是这两种情况下程序执行的结果不同。
提示:被双引号括起来的字符串中,注释符 /*属于字符串的一部分,而在注释中出现的双引号又属于注释的一部分
思绪
- 要形成嵌套注释,这个字符串序列必须含:/* /**/*/。
- 首先先讨论:/*/**/ 。对于不可允许嵌套注释的编译器来说,这就是一个完整的注释了;对允许嵌套注释的编译器来说,后面的字符都是注释的一部分。
- 我们在后面加上:"* /",将其变成:/* /**/"*/"。
- 对于不允许嵌套注释的编译器来说:上面字符串等效于字符串:"*/"。对于允许嵌套注释的编译器此时无法通过编译(剩下一个双引号)
- 因此我们在后面接着跟一个注释符和一个双引号:/* /**/"* /"/*" 。
- 对于允许嵌套注释的编译器来说:上面字符串等效于"/* " ;对于不允许嵌套的注释的编译器来说:上面字符串等效于" * /" / *"(用括号引起的注释结束符,后跟一段未结束的注释
- 最后简单的让最后的注释结束:/* /** /"* /"/*"/**/
- 这样如果允许嵌套注释,上面字符串等价于"/*" ,如果不允许嵌套注释等价于" */"
参考链接:https://blog.csdn.net/weixin_33859693/article/details/117036478