为什么嵌套在C ++中,一个事实,即嵌套的注释是有用的,整洁,优雅,可以用来注释掉有注释语句在Java inspite禁止评论?
C和C ++做便于解析。这样一来,当他们击中/ *的注释开始,解析器可以平凡扫描到最后。否则,就必须建立和维护一个堆栈,然后如果注释标记是无与伦比报告错误。
至于为什么Java那样呢,答案很简单 - Java的语法的目的是要模仿C和C ++。如果嵌套评论是允许的,这可能会令一些C程序员,许多愤怒的博客文章将被写入!
至少对于C ++,这只是部分是真实的,有没有问题:
/*
//
//
*/
但是,如果你已经得到了你想要注释掉的区间中的/ *注释你也许可以通过与#if 0
,我想很多的编译器优化掉周围做到这一点。如:
#if 0
/*
*/
#endif
它是为每种语言( - 家庭)不同,但一般他们不“禁”,但根本不支持。支持他们的是一个设计选择。
供选择(用于较老的语言)的一个原因可能是便于解析。
注:我记得有一个C ++编译器在哪里,这是一个选项,让它们的巢。它被标为“非标”。
与C.一致性/兼容性
请看下面的例子:
/* This is a comment /* Nested Comments */ are not allowed. */
任何有位于/*
和*/
之间被视为注释。在从向上This
上面的例子Comments
一切都视为注释包括/*
。因此,are not allowed. */
不在于评论。发生这是一个不正确的C语句错误。
虽然考虑这个例子:
// This is an /* valid */ comment
无论在//
后线位于被视为注释。由于/* valid */
在于//
后的同一行,它被视为注释的一部分。
在语言,允许任意长度的意见,这是很常见的程序员意外注释掉,或者在某些罕见的情况下,“取消注释早在”比期望的更多或更少的代码。在许多情况下,这种错误会导致编译错误,但在其他情况下,他们可能会导致代码这简直是坏。随着现代语法高亮的编辑器,每个/*
将增加一个嵌套评论柜台,每个会递减,可能不会造成太大的麻烦*/
的规则,但没有语法高亮,甚至试图找出哪些代码被注释掉,什么码WASN “T可能是一个大难题。
如果一个从头开始设计一种语言,一个很好的办法可能是指定启动的注释,并且包含一个可选的字符串结束注释标记,并有语言强制执行的要求,在一个字符串end-OF-注释标记必须在其相应的开始时间的注释标记的字符串相匹配。假设语法是<|String|
和|String|>
,编译器可以然后接受<|1| <|2| |2|> |1|>
,但拒绝<|1| <|2| |1|> |2|>
。即使有人赞成使用#if
的指令,而不是评论,附加标记的能力,以确保每个终端指令被匹配了与预期的启动指令将是有益的。
问题是,你不能简单地“跳过”块。块有数量不明的人里面块,所以为了知道什么时候该块完成后,就不能使用普通的语言,你必须使用一个堆栈,并通过每一块走,直到堆栈是空的,在这一点你知道该块已完成。
为什么你不能跳过块的原因是,该块的正则表达式只能匹配的/ *或者用“第一个* /它看到继”或“最后一个* /它看到后”或“第n * /它看到后”。
如果我们用第一个“* /”符号,我们看到走,我们可能有这样的代码
/*
/*
*/
the compiler matched /* with */ and this line and the next one will confuse it.
*/
如果我们最后的“* /”符号,我们看到走,我们的代码编译器将跳过文件和文件末尾的最后一个注释的第一条评论之间的事情。在这种情况下,下面的代码将被解析为一个空字符串。
/*
/* hello, world! */
*/
int main(int argc, char ** argv) {
return 0;
}
/* end of file */
我们不能跳过n个不强制所有评论有深度的确切数量的内块的第三个选项去,否则会找不到内评论和混淆。
其实,有一个明确的指出,评论可以是一个评论,一个2-范围注释,一个3-范围注释等第四个选项;但这样做,这是一个丑陋的和深度的每级需要一个显著较长的表达,而这种做法限制的注释到特定的深度可能适合一些人,不适合别人:如果您注释掉已被注释掉代码3次?
一般解决方案可以与预先预处理如实施:
<?php
function stripComments($code) {
$stack = array();
$codeOut = '';
$stringStream = fopen('php://memory', 'r+');
fwrite($stringStream, $code);
rewind($stringStream);
while (!feof($stringStream)) {
$ch = fgetc($stringStream);
$nextChar = fgetc($stringStream);
if ($nextChar === false) {
break;
}
if ($ch == '/' && $nextChar == '*') {
array_push($stack, '/*');
} else if ($ch == '*' && $nextChar == '/') {
if (count($stack) > 0) {
array_pop($stack);
} else {
die('cannot pop from empty stack');
}
} else {
if (count($stack) == 0) {
$codeOut .= $ch;
fseek($stringStream, -1, SEEK_CUR);
}
}
$prevChar = $ch;
}
return $codeOut;
};
?>
这是稍微比什么C目前使用较为复杂:
function stripComments($code) {
return preg_replace('/\/\*[^\*\/]*\*\//', '', $code);
}
这并不考虑/**/
块引号内,稍微更复杂的叠层,可以在...之间“/ *”范围和“\””是必需的范围进行区分。
有意见的注释中的好处是,你可以注释掉包含注释,而无需手动剥离的意见,这对于那些对每一行注释块特别沮丧块。
总结:这是可以做到的,但大多数语言不想把意见,如果他们自己的范围,因为它需要更多的努力来解析。