注释可以在运行时产生任何影响吗?
Posted
技术标签:
【中文标题】注释可以在运行时产生任何影响吗?【英文标题】:Can comments make any difference during the run-time? 【发布时间】:2013-12-05 21:12:08 【问题描述】:阅读What is the best comment我遇到this评论,点赞201次:
很久以前,我不小心通过添加一个 评论。它是 100% 可重现的;如果我删除了评论,它 坠毁。只要评论在那里,它就可以正常工作。我假设它 是一些奇怪的时间问题,但我从来没有弄清楚到底是什么 正在发生。
这可能吗?
如果他正在修复 Java3D 中的段错误,我猜他正在用 Java 或 C/C++ 编写代码。我认为在任何这些语言中,cmets 在编译之前都会被简单地擦除......
【问题讨论】:
这是不可能的,如果他插入评论的位置有一个特殊字符会发生什么,我以前也发生过这种情况,在 unix、windows 和 solaris 上工作相同的代码. 在 C 和 C++ 中,cmets 被预处理器删除:甚至在编译器看到代码之前。我见过 cmets 发出警告,例如:// does this work???
used to give an warning about an invalid trigraph.
@RamonBoza 这个特殊角色很有趣(哪一个?) - 请您详细说明答案?
【参考方案1】:
不这么认为。为了运行Java程序,它应该被编译成字节码,这样在编译过程中cmets会被擦除,不会影响程序的执行。
【讨论】:
【参考方案2】:我认为在任何这些语言中,cmets 都会被简单地擦除 编译前...
看起来可能是这样,但不幸的是,这个看起来无害的Hello World
程序甚至无法编译。
为什么?因为一个评论。罪魁祸首是来源的路径。具体来说,\users
。反斜杠\
后跟字母u
,表示Unicode 转义的开始。尾随的 sers
使其成为格式错误的 Unicode 转义。 (如果\u
后跟 4 个十六进制数字就可以了 - 是的,即使在评论中也需要。)
因此,代码甚至无法编译由于注释。
public class HelloWorld
/**
* Source: C:\users\devnull\HelloWorld.java
*/
public static void main(String[] args)
System.out.println("Hello World!");
【讨论】:
【参考方案3】:这里有两种解释。
一,记者错了。他们没有进行他们认为自己正在进行的编辑,或者编译或执行不正确,或者错误是不稳定的,并且与他们的编辑偶然相吻合,等等。
第二,编辑删除了看起来像注释的内容,但它实际上与其他语法交互。例如,考虑:
/* Start comment.
…
/* Not a new comment. */
… Some code here …
/* Sometimes a comment. */
当出现“Not a new comment”行时,“Some code here”是不属于注释的源代码。当“Not a new comment”行不存在时,“Some code here”是注释的一部分。
【讨论】:
【参考方案4】:正如您所说,Java cmets 不包含在编译的字节码中。例如,参加以下课程:
public class test
public void methodWithoutComment()
System.out.println("This method does not have a comment");
public void methodWithComment()
// Method with comment
System.out.println("This method has a comment");
如果我们使用javap
反省字节码,使用javap -c test
,我们可以看到两种方法的字节码是相同的——除了输出到控制台的字符串:
public class test
public test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void methodWithoutComment();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String This method does not have a comment
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public void methodWithComment();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #5 // String This method has a comment
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
【讨论】:
以上是关于注释可以在运行时产生任何影响吗?的主要内容,如果未能解决你的问题,请参考以下文章