块注释是否旨在使用单个字符启用/禁用块?

3

请观察以下代码块:

//*
 ... code block ...
//*/

只需使用第一个斜杠即可启用/禁用它。

/*
 ... code block ...
//*/

这是有意为之,还是一个巧合呢?
似乎没有任何相关的历史记录。


这是一个聪明的技巧,但如果没有良好的语法高亮,很难确定它设置的方式。 - stark
1
@stark:是的,这是一个聪明的技巧。多年来我学到了,“聪明”通常是不好的事情。 - Keith Thompson
实际上,这个聪明的技巧应该改为普通的预处理指令。 - Michael Burr
2
我同意。#if 0#if 1只有一个字符的区别。 - stark
@KeithThompson 在生产/公开共享的代码中,聪明反而是一件坏事。在单次使用/私人代码中,我认为使用聪明的做法可能是适当的。 - svick
@stark:但是01一眼就能区分开来。或者你可以在每行要注释的代码前面插入//(这在任何一个好的编辑器中都很容易实现)。 - Keith Thompson
3个回答

1
我怀疑你无法说它是这样设计的。块注释在单行注释出现之前就已经被引入 C 了——在你添加另一个斜杠后,这就是你的代码最终呈现的形式。
我更愿意称其为一种幸运的巧合。

4
是的,但是//注释来源于C语言的祖先语言BCPL。BCPL并没有/* ... */这种注释方式,这种注释方式来自于PL/I语言。我猜测C++是第一种同时支持两种注释方式的编程语言。 - Keith Thompson

1

很难说它是设计得到的还是一种“巧合”。 对我来说看起来像是设计的(但我认为这也取决于注释行之间的内容)。

看来我误解了问题-我以为OP遇到了一些格式化为这种方式的代码,并想知道写它的人是否打算通过改变单个字符来启用/禁用它。

至于C注释样式是否被设计为允许这种行为,我非常确定答案是“不”。 C99标准理据文件没有提到这种技术,如果评论被设计为启用它,我认为这应该在理据中。实际上,理据明确指出,注释不应用于禁用代码,而应使用预处理器机制。

此外,如果注释语法被设计为允许这种巧妙的方法(我确实认为它很聪明),我相信之前已经有人写过它了。这是我第一次看到混合注释样式以启用/禁用代码块的技术。

我偶尔为某些类型的调试而故意采用类似的设计(我不建议将下面的结构提交到版本控制 - 如果你确实需要在两个或更多选项之间进行选择,请改用 #if 或类似的预处理方法):

int x = /**/ 123 /*/ 456 /**/;

如上所述,123 将被激活,456 将被注释掉。
删除前两个 '*' 字符中的一个将使 123 不再激活,456 将被激活。

1
“/* */”注释起源于C语言,并被C++采用。C++还添加了“//”用于单行注释。你展示的是这两种注释相互作用的有趣例子。我怀疑在编写标准时,没有人想到过这一点,如果他们想到了,那么他们可能会认为“不要那样做”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接