【发布时间】:2011-04-05 10:02:51
【问题描述】:
我正在与一些学生讨论 C 编程风格,当我们谈论 cmets 时,其中一位指出他没有在 C 代码中使用 C++ cmets,因为它们是一个坏主意。事实证明,这是基于个人使用多行 C++ cmets 的经验,但这并不是我第一次听到这种说法。那么,// 是否被认为是有害的,如果是,那么为什么?
【问题讨论】:
标签: c coding-style comments
我正在与一些学生讨论 C 编程风格,当我们谈论 cmets 时,其中一位指出他没有在 C 代码中使用 C++ cmets,因为它们是一个坏主意。事实证明,这是基于个人使用多行 C++ cmets 的经验,但这并不是我第一次听到这种说法。那么,// 是否被认为是有害的,如果是,那么为什么?
【问题讨论】:
标签: c coding-style comments
如果您在 C 中使用 C++ cmets,则可能某些 C 编译器不会接受您的代码。我会认为这是有害的。
【讨论】:
这取决于您使用的 C 版本。 C 99 允许 // 作为注释,而 C 89 不允许。
如果您希望尽可能向后兼容,请不要使用它们。但是,我认为这是一个极端的边缘案例。我敢打赌几乎每个人都使用 C 99。
编辑:任何最新版本的 GCC 都使用 C99 的大部分内容。你可以在Wikipedia找到更多信息。
【讨论】:
-ansi -pedantic -W -Wall,这使得 gcc 在拒绝和警告错误代码方面非常严格。它还拒绝// cmets。如果你想接受 C99 的东西但保持严格性,你可以使用 -std=c99 而不是 -ansi,但我更喜欢我的 C 代码尽可能广泛兼容。
// cmets
C++ 风格的 cmets 已通过(尚未广泛支持的)C99 标准添加到 C 中。虽然标准本身并没有得到广泛的全面支持,但它的某些部分(如 C++ 风格的 cmets)现在几乎在每个编译器中都得到了支持。考虑到它们是被添加的,这意味着需要它们,所以很容易发现它不会被认为是糟糕的风格——特别是如果你为自己设定了在哪里使用的指导方针。
不使用它们的唯一原因是如果您想编写格式良好的 C89 编译程序。
【讨论】:
restrict - remaining issues 似乎主要围绕新的浮点语义和数学函数。
"//" 在 C99 中受支持,但在 C89(这是迄今为止最受支持的方言)中不受支持。
【讨论】:
人们使用// 而不是/* */ 的一个常见原因是您可以“嵌套”前者而不是后者,因此您可以注释掉其中包含 cmets 的代码。但无论如何,您确实应该使用 #if 0 来注释掉 C 中的代码。
【讨论】:
git-commit 记录历史,git-pull/git-push 共享代码。
根据MISRA-C 2004 标准,不允许使用 C++ cmets。某些行业(特别是汽车行业)重视符合 MISRA 的代码,因此不允许使用 C++ cmets。我相信其他静态代码检查工具如 LDRA 等也是如此......
这并不会使它们天生不好,但这确实意味着,如果您进入某些行业并想从事专业工作,那么您将被积极劝阻不要使用 C++ 风格的 cmets。
【讨论】:
// cmets
如今这真的不应该成为任何问题,除非您维护的代码是专门为使用古老的编译器等编译而编写的。
【讨论】: