为什么嵌套评论被禁止?

Pri*_*han 15 language-features comments programming-languages

为什么嵌套注释在C++,Java中被禁止,尽管嵌套注释有用,整洁,优雅,可用于注释掉有注释的语句?

Cla*_*bel 14

C和C++这样做是为了便于解析.这样,当他们点击/*的评论开始时,解析器可以轻易地扫描到最后.否则,它必须设置并维护堆栈,然后如果注释标记不匹配则报告错误.

至于为什么Java这样做,答案很简单 - Java的语法被设计为模拟C和C++.如果允许嵌套注释,它可能会绊倒一些C程序员,并且会编写许多愤怒的博客文章!

  • 为什么需要堆栈来处理嵌套注释?只需维护一个计数器,每次遇到`/*`时递增计数器,并在每次遇到`*/`时递减计数器.当计数器大于零时,你会抛出你找到的任何字符(同时仍然跟踪`/*`和`*/`); 当计数器为零时,您通常会读取令牌并将其交给解析器; 如果计数器变为负数,则报告注释分隔符之间不匹配.您在词法分析期间执行此操作,因此解析器甚至不会看到注释. (5认同)

Han*_*son 8

至少对于部分正确的C++来说,没有问题:

/*
//
//
*/
Run Code Online (Sandbox Code Playgroud)

但是,如果你已经在一个想要注释掉的部分中得到/*注释,那么你可以用一个#if 0我认为许多编译器优化掉的部分来做它.如:

#if 0
/*

*/
#endif
Run Code Online (Sandbox Code Playgroud)

  • 编译器不会看到这个块,*预处理器*将在编译器关注代码之前将其删除:). (5认同)

Hen*_*man 5

每种语言(-family)都不同,但总的来说,它们不是“禁止”的,而是不支持的。支持它们是一种设计选择。

选择(对于较旧的语言)的一个原因可能是易于解析。

注意:我记得有一个 C++ 编译器,可以选择让它们嵌套。它被标记为“非标准”。