如何解决嵌套评论的问题


23

不能嵌套注释的语言不只是一种。您对此问题有很好的解决方案吗?在C / C ++和Java中,一种解决方法是仅使用单行注释,但是注释掉较大的块将变得不可能。我正面临着这样的事情:

</li><!--
                <li><!-- Save -->

因此,我必须手动浏览并编辑评论。您能以多种语言建议我们应该如何处理吗?我不确定,但是python '''可能为此提供了解决方案,可以#在python中添加注释?`


4
我认为只有编辑才能为您提供帮助。但是,IDLE将为您阻止有关Python IIRC的评论。
Erik Reppen 2013年

7
Python不不会有块注释。该'''"""字符串文字。碰巧的是,解释器将在编译过程中对它们进行评估(转换为字节码),并将字符串文字识别为no-ops(因此它们不会减慢字节码的执行/加载时间)。文档字符串,即紧接def在正文之后但在正文之前的字符串文字,不会被剥夺,因为解释器假定它们为函数提供了文档。
Bakuriu

7
在C / C ++中,如果要删除较大的部分,请使用#if 0<code> #endif。因此,这实际上不是问题。使用注释执行此操作是错误的工具。
马丁·约克

1
很久以前,我切换为仅使用行注释(只要不强制使用,例如Javadoc)。当然,您需要编辑器支持(或至少是列模式)。
ziggystar 2014年

Answers:


46

显然,最好的解决方案是不嵌套您的评论。嵌套注释通常表示您使用的注释错误。最常见的示例是注释掉的代码,其中包含注释本身,而解决方法是删除代码而不是注释掉。

就是说,许多编程语言都具有不止一种注释语法,您可以使用此事实嵌套至少一层深度。例如,在Java中:

/* This is commented out!
Foo.bar.baz();
// And now for something completely different...
Quux.runWith(theMoney);
*/

同样,在许多语言中,至少一种评论类型是嵌套的;在类似C的语言中,将忽略行注释中的行注释:

// some_commented_out(code);
// // This is a comment inside the comment!
// // Still inside the nested comment.
// some_more_code_in(outer_comment);

大多数IDE支持在一个动作中用行注释注释整个代码块,并且它们正确处理了这种注释样式。Python中的相同示例:

# some_commented_out(code)
# # This is a comment inside the comment!
# # Still inside the nested comment.
# some_more_code_in(outer_comment)

通常,特定项目的编码标准都有关于何时使用哪种注释样式的规则。常见的约定是/* */对方法和类文档使用块注释(),对//方法主体等内部的注释使用内联注释(),例如:

/**
 * Helper class to store Foo objects inside a bar.
 */
public class Foobar {
    /**
     * Stores a Foo in this Foobar's bar, unless the bar already contains
     * an equivalent Foo.
     * Returns the number of Foos added (always 0 or 1).
     */
    public int storeFoo(Foo foo) {
        // Don't add a foo we already have!
        if (this.bar.contains(foo)) {
            return 0;
        }
        // OK, we don't have this foo yet, so we'll add it.
        this.bar.append(foo);
        return 1;
    }
}

使用这种样式,您几乎不需要嵌套/* */注释(如果必须暂时禁用整个方法或类,则对它们进行重命名也可以很好地工作,即使不是更好)。和//注释嵌套,至少在您的IDE的帮助下。

最后,要禁用代码,您可以使用许多编程语言提供其他选项;例如,在C语言中,您可以利用预处理器:

this_is(activated);
#if 0
this_is(!activated);
/* Comments inside this block don't really nest, they are simply removed
   along with the rest of the block! */
#endif

在动态语言中,通常可以使用正则if语句来代替:

<?php

if (0) {
   // This should never run... 
   some_stuff_that_should_never_run();
}

但是,与CPP示例不同,此策略要求源文件作为一个整体在语法上有效,因此到目前为止,它并不那么灵活。

最后,至少有些语言允许嵌套注释。如果您有兴趣,Wikipedia有一个不错的比较表


2
SQL的某些变体是否允许嵌套注释?
Xavier Combelle

3
+1为// And now for something completely different...
Vorac

1
@Vorac:很高兴您喜欢参考文献:D
tdammers

18

C和C ++确实具有嵌套的块注释:

#if 0
#endif

许多突出显示的编辑器将其理解为注释,而其他许多编辑器至少会将其突出显示为任何其他有条件禁用的代码。

在许多其他语言中,您必须依靠编辑器支持。对于仅具有基于行的注释的语言(perl,python,ruby,shell ...),将注释字符添加到范围中的所有行是相当简单的,因此大多数编辑者都可以这样做。在注释掉整个块之前,您仍然可以说出注释是什么,因为注释字符加倍了-这样做很容易。

XML和SGML可能是最大的麻烦,它的注释定义只是愚蠢的。评论本来就不容易嵌套,但不仅如此,而且完全禁止包含--内部评论。不幸的是,我不知道哪些编辑器对使用SGML / XML进行注释提供了很好的支持。


2
从来没有想过将这些预处理程序指令用作实际注释。对于C#来说也很有趣,但是在那种情况下,您必须做一些#if _效果很好的事情,并且在我的VS中用Re#变灰。不错的提示!
绝望的鬼脸2013年

2

虽然这不是一个通用的解决方案,当然也不是理想的解决方案,但是解决此特定问题的一种方法是使用服务器端模板处理语言对嵌套的代码注释元素进行块注释。这使内容基本上保持完整,但是阻止将其发送到客户端浏览器。

如果文件是直接且不需要其他服务器端处理的纯内容,那么这没有太大帮助。在这种情况下以及嵌套注释的更一般情况下,请问为什么要这样做。在大多数情况下,可能会发现处理它的最佳方法是不全部处理。换句话说,如果您想删除一个部分,则将其删除,然后让该版本控制程序记住该部分的差异(如果该部分作为工件需要重新使用)。


0

在HTML / XML的情况下,您可以使用不存在的处理指令:请参阅我关于SO的答案

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>

0

Swift支持嵌套注释,因此“它不仅以一种不能嵌套注释的语言出现”,不再是真实的声明。如果您对缺少编程语言中对嵌套注释的支持感到不满意,建议您尝试一下Swift。

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
 This is the end of the first multiline comment. */

Swift编程语言:基础知识


0

D编程语言具有嵌套的内置注释:

/+ This is a nested comment 
  /+ This is part of that a comment +/
  /* So is this */
+/
/+ /* This is another nested comment */ +/
/* /* This is not a nested comment */

换句话说,/++/注释嵌套。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.