【问题标题】:Are C++ comments considered bad style in C? [closed]C++ 注释在 C 中被认为是不好的风格吗? [关闭]
【发布时间】:2011-04-05 10:02:51
【问题描述】:

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

【问题讨论】:

    标签: c coding-style comments


    【解决方案1】:

    如果您在 C 中使用 C++ cmets,则可能某些 C 编译器不会接受您的代码。我会认为这是有害的。

    【讨论】:

    • 好点。在过去的 20 年里我还没有见过这样的编译器,但这将是它有害的唯一原因。 Otoh 从项目中剥离 C++ cmets 最多需要一个小时。
    • 一个小时?最多 5 分钟编写 Perl 脚本...
    • @Kornel 一个可以处理字符串文字、二合字母和三合字母的 Perl 脚本? 5分钟内?你能不能让它也适合这样的评论,我很好奇......
    • @Phillip,我从事嵌入式开发工作。他们中的大多数不支持 C99,但即使是最古老的,从 C90 之前的日子开始,也允许 C++ cmets 作为扩展。
    • @Pascal,如果你使用二合字母和三合字母,C++ 风格的 cmets 不是你最大的问题:P
    【解决方案2】:

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

    如果您希望尽可能向后兼容,请不要使用它们。但是,我认为这是一个极端的边缘案例。我敢打赌几乎每个人都使用 C 99。

    编辑:任何最新版本的 GCC 都使用 C99 的大部分内容。你可以在Wikipedia找到更多信息。

    【讨论】:

    • 我的标准 gcc 选项是 -ansi -pedantic -W -Wall,这使得 gcc 在拒绝和警告错误代码方面非常严格。它还拒绝// cmets。如果你想接受 C99 的东西但保持严格性,你可以使用 -std=c99 而不是 -ansi,但我更喜欢我的 C 代码尽可能广泛兼容。
    • 老实说,我在编译器选项方面经验不足。我仍在学习正确使用指针;)。我是一个 PHP 人,独自进入 C/C++。我只是知道其中的区别,因为我在高中时也有同样的问题。
    • 其实很少有人用C99。只是大多数 C 编译器(甚至 C90 编译器)都接受 // 作为扩展名。
    • @HappyGreenKidNaps 这正是我要说的。 +1。
    • 大多数编译器都是 C90+(即它们的官方名称是 C90,但带有扩展),最普遍支持的扩展可能是 // cmets
    【解决方案3】:

    C++ 风格的 cmets 已通过(尚未广泛支持的)C99 标准添加到 C 中。虽然标准本身并没有得到广泛的全面支持,但它的某些部分(如 C++ 风格的 cmets)现在几乎在每个编译器中都得到了支持。考虑到它们是被添加的,这意味着需要它们,所以很容易发现它不会被认为是糟糕的风格——特别是如果你为自己设定了在哪里使用的指导方针。

    不使用它们的唯一原因是如果您想编写格式良好的 C89 编译程序。

    【讨论】:

    • C99 没有得到广泛支持?哪些当前可用的 C 编译器不支持 C99?我的意思是,至少 C99 的大部分内容包括 //-Comments ...
    • @maxschlepzig:这很简单 - MSVC。
    • @Kornel:他确实说过“......至少大部分 C99 包括 //-Comments”。我相信你提到的所有这些都支持 C99 的一个相对较大的子集,包括 C++ 风格的 cmets。
    • @Kornel,'restrict' 和 VLA 很简洁,但我认为 stdint.h、long long int 支持和最重要的指定初始化程序等内容更为重要。使用 alloca() 可以轻松模拟 VLA,“restrict”只是优化器的提示。
    • @Kornel:gcc 确实支持大部分 C99,包括 VLA 和 restrict - remaining issues 似乎主要围绕新的浮点语义和数学函数。
    【解决方案4】:

    "//" 在 C99 中受支持,但在 C89(这是迄今为止最受支持的方言)中不受支持。

    【讨论】:

      【解决方案5】:

      人们使用// 而不是/* */ 的一个常见原因是您可以“嵌套”前者而不是后者,因此您可以注释掉其中包含 cmets 的代码。但无论如何,您确实应该使用 #if 0 来注释掉 C 中的代码。

      【讨论】:

      • 实际上,您应该使用版本控制系统来跟踪旧的、未使用的代码;)
      • 除非您正在测试不应该提交的更改。
      • 不,你还是应该使用版本控制系统。 VCS 应该已经有代码的副本,因此您可以安全地删除它。然后,稍后从 VCS 中将其复活是一件简单的事情。
      • 好吧,我是一个 Git 用户,所以我只是将我写的所有代码都塞进我的本地 repo 中。然后我在分享之前先清理一下。在你破解某些功能时记录历史确实很有用,比使用“#if 0”-nastiness 手动记账更有用;)
      • 如果您有“不应该提交”的更改,那么您要求您的 VCS 执行太多单独的工作。是保留完整的代码历史记录,还是帮助在不同用户之间共享代码?当您进行黑客攻击并想要存储更改但又不想共享它们时会发生什么?分布式 VCS 通过将记录历史和共享代码的这些关注点分离到不同的操作中来解决这个问题。 git-commit 记录历史,git-pull/git-push 共享代码。
      【解决方案6】:

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

      这并不会使它们天生不好,但这确实意味着,如果您进入某些行业并想从事专业工作,那么您将被积极劝阻不要使用 C++ 风格的 cmets。

      【讨论】:

      • +1 您提出的非常有趣的问题。
      • MISRA C:2012(包括 C99 合规性)将允许 // cmets
      【解决方案7】:

      如今这真的不应该成为任何问题,除非您维护的代码是专门为使用古老的编译器等编译而编写的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 2012-12-15
        • 2010-12-17
        • 1970-01-01
        相关资源
        最近更新 更多