C++的注释在C语言中被认为是不好的风格吗?

18

我和几名学生讨论C编程风格时,当我们谈论注释时,其中一名学生指出他不在C代码中使用C++注释,因为它们是个坏主意。结果证明这是基于多行C++注释的个人经验,但这并不是我第一次听到这种说法。那么,// 被认为是有害的吗?如果是,为什么?

7个回答

28

这取决于你使用的C语言版本。C 99允许 // 作为注释,而 C 89 不允许。

如果你想尽可能向后兼容,请不要使用它们。但我认为这是一个极端的边缘情况。我打赌几乎所有人都使用C 99。

编辑:任何较新版本的GCC都使用了大部分的C99特性。你可以在维基百科中找到更多信息。


4
我的标准GCC选项是-ansi -pedantic -W -Wall,这使得GCC在拒绝和警告不良代码方面非常严格。它也会拒绝使用//注释。如果你想要接受C99的内容但保持严格性,可以使用-std=c99而不是-ansi,但我更喜欢我的C代码尽可能地兼容广泛。 - Philip Potter
我对编译器选项并不是很有经验。我仍在学习正确使用指针的方法;)。我曾经是一个PHP程序员,自己开始接触C/C++。我知道这个区别是因为我在高中时也曾经问过同样的问题。 - Codeacula
2
实际上很少有人使用C99。只是大多数C编译器(甚至是C90的)接受//作为扩展。 - Happy Green Kid Naps
@HappyGreenKidNaps,这正是我要说的。+1。 - RastaJedi
大多数编译器都是C90+(即它们正式是C90,但带有扩展功能),最常支持的扩展可能是//注释。 - Andrew

12

根据MISRA-C 2004标准,不允许使用C++注释。特定行业(尤其是汽车行业)看重符合MISRA标准的代码,因此不允许使用C++注释。我相信其他静态代码检查工具如LDRA等也是如此...

这并不意味着它们本质上是不好的,但这意味着如果你进入某些行业并想要专业工作,你将被积极劝阻使用C++风格的注释。


你提出了一个非常有趣的问题。 - Philip Potter
5
MISRA C:2012标准(包括符合C99标准)允许使用//注释。 - Andrew

10

如果在C语言中使用C++注释,有可能会导致某些C编译器无法接受您的代码。我认为这是不利的。


3
好的。在过去20年中,我没有见过这样的编译器,但这将是它有害的唯一原因。另一方面,从一个项目中剥离C++注释最多只需要一个小时。 - Nils Pipenbrinck
3
一个小时?写一个 Perl 脚本最多只需要 5 分钟时间... - Kornel Kisielewicz
1
@Kornel 一个能够处理字符串字面量、双字母符号和三字母符号的 Perl 脚本?5 分钟内完成?你能否让它适应 SO 评论框,我很好奇... - Pascal Cuoq
2
@Phillip,我从事嵌入式开发工作。大多数嵌入式系统不支持C99,但即使是最古老的那些,也允许使用C++注释作为扩展。 - Nils Pipenbrinck
4
@Pascal,如果你在使用双字母和三字母符号,那么C ++样式的注释并不是你最大的问题 :P。 - Kornel Kisielewicz
显示剩余4条评论

5
使用C++风格的注释是在尚未广泛支持的C99标准中添加的。虽然该标准本身并未得到广泛支持,但其中的一些部分(如C++样式注释)现在几乎被每个编译器所支持。考虑到它们的添加,这意味着有需要使用它们,因此很容易想到它不会被认为是不好的风格 - 尤其是如果您设定了在哪里使用哪种注释的指南。唯一不使用它们的原因是,如果您想编写符合良好的C89编译程序。

2
很容易 - MSVC。 - kusma
@kusma,以及GCC,Intel C,Clang,实际上除了Sun Studio之外的任何编译器... - Kornel Kisielewicz
1
@Kornel:他确实说过“...至少包括C99的大部分,包括//-Comments”。我相信你提到的所有内容都支持相对较大的C99子集,包括C++风格的注释。 - kusma
1
@Kornel,“restrict”和VLA很不错,但我认为像stdint.h、long long int支持以及最重要的指定初始化程序之类的东西更为重要。可以使用alloca()轻松模拟VLA,“restrict”只是优化器的提示。 - kusma
1
@Kornel:gcc 支持大多数 C99,包括 VLAs 和 restrict - 剩余的问题似乎主要集中在新的浮点语义和数学函数上。 - caf
显示剩余4条评论

2

人们使用// 而不是 /* */ 的一个普遍原因是前者可以“嵌套”,而后者不行,因此您可以注释掉具有注释的代码。但是在 C 中,您真正应该使用#if 0 来注释掉代码。


6
实际上,您应该使用版本控制系统来跟踪旧的、未使用的代码 ;) - kusma
4
嗯,我是一个Git用户,所以我在编写代码时将所有代码都放入本地仓库中。然后在分享之前进行清理。在开发某个功能时拥有历史记录非常有用,比手动记录“#if 0”更加方便。;) - kusma
2
如果您有“不应提交”的更改,则是要求您的VCS执行过多的单独作业。它是否存在以保留代码的完整历史记录,还是存在以帮助不同用户共享代码?当您进行黑客攻击并想要存储更改但尚不想共享它们时会发生什么?分布式VCS通过将记录历史和共享代码的关注点分离为不同操作来解决此问题。 git-commit 记录历史记录,git-pull/git-push 共享代码。 - Philip Potter
@Andrew那如果我想注释掉已经有注释的一行代码怎么办?比如像//foo(); // call function foo或者/* foo(); // call function foo */这样的情况。另外,关于版本控制系统,git有一个很棒的stash功能,可以用来处理你想要保存的临时代码。“当你想记录当前工作目录和索引的状态,但是想回到一个干净的工作目录时,请使用git stash。该命令将您的本地修改保存并将工作目录恢复为与HEAD提交匹配的状态。” - RastaJedi
注释掉一行代码并不是一个好的实践... 我建议使用 #ifdef ENABLE_THE_NEXT_LINE ... #endif 作为更好的选择。 - Andrew
显示剩余4条评论

1

现在这应该不是什么问题了,除非你正在维护为古老编译器编写的代码。


0

在C99中支持"//",但在C89(目前最受支持的方言)中不支持。


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