【问题标题】:coding style checker for c (variable names, not indentation)c 的编码样式检查器(变量名,不是缩进)
【发布时间】:2011-03-29 15:24:06
【问题描述】:

This question 询问编码样式检查器,但重点似乎是缩进和大括号放置。 GNU indent 处理缩进(这在这个代码库中不是问题,令人惊讶的是)。

我正在处理一堆充满各种命名方案的代码:camelCaseeverythingruntogetherinlowercaseunderscores_as_separatorsSomeStructsEndWithT 等。

我希望能够选择一个约定,并且至少可以自动检查新更改是否符合约定。

在 C 中检查命名是否有好的工具?类似于 Python 的 pep8 检查器工具,我不想要美化器。

谢谢。

【问题讨论】:

  • 在大多数情况下,几个正则表达式可能会涵盖这一点。结合现有的词法分析器,可以轻松忽略除标识符之外的所有内容。
  • Linux 内核有一个用 Perl 编写的名为 checkpatch.pl 的样式检查器脚本。它在 linux/scripts 下。
  • 您想要做的真正问题是您可能会在区分大小写的语言上执行此操作,并且有两个字母相同但大小写不同的变量。然后,您可能最终会破坏您的代码。我会非常谨慎地处理这个问题。
  • @hvanbrug 这正是为什么拥有一致的案例风格很重要,因此这个问题;具有相同名称但大小写不同的变量对于编译器来说可能没问题,但会让人类维护者感到困惑。
  • 我同意,这确实需要在项目开始时执行,而不是进行到一半(但有时你别无选择,我知道)。

标签: c coding-style naming-conventions


【解决方案1】:

看起来 Google 的 cpplint(一个 C++ 样式检查器)可以被黑入提交,以便按照我的意愿检查 C。

(我仍然想知道是否有更好的跳棋。)

【讨论】:

    【解决方案2】:

    这是一个非正统的选择,但如果你愿意花半天的时间,我会选择cxref。它是一个交叉引用器,带有源代码,它有一个干净的解析器并且不构建解析树。然而,通过几行代码,您可以转储所有变量以检查它们,或者将它们重写为您喜欢的样式(或者如果您像我一样懒惰而不是重写,您可以为 emacs/sed 生成替换命令)。我只设法为 Mac 构建它。

    【讨论】:

    • +1:我认为使用cxref(或者ctags)来完成提取变量名所需的所有硬解析工作有很多话要说。我认为您不必修改这些程序中的任何一个 - 只需使用 sedperlpython 或任何脚本对输出进行后处理以检查是否符合标准。
    • 什么是正统的选择?
    【解决方案3】:

    这个帖子里已经有很多答案了Coding style checker for C

    其中 Vera++ 可能是最有前途的,因为大多数其他建议是格式化程序而不是验证程序。有一个关于运行 vera++ 的网页在 https://bitbucket.org/verateam/vera/wiki/Running.

    https://bitbucket.org/verateam/vera/downloads/vera++-1.1.1.tar.gz有下载 编译会出现一些问题:

    最后,在 C++ 文件上运行它会产生如下输出(为简洁起见,省略了重复错误):

    ../dllist.c:1: no copyright notice found
    ../dllist.c:4: horizontal tab used
    ../dllist.c:10: horizontal tab used
    ../dllist.c:10: closing curly bracket not in the same line or column
    ../dllist.c:29: horizontal tab used
    ../dllist.c:38: keyword 'if' not followed by a single space
    ../dllist.c:38: negation operator used in its short form
    ../dllist.c:40: horizontal tab used
    ../dllist.c:40: full block {} expected in the control structure
    ../dllist.c:42: horizontal tab used
    ../dllist.c:71: keyword 'if' not followed by a single space
    ../dllist.c:71: negation operator used in its short form
    ../dllist.c:72: horizontal tab used
    ../dllist.c:72: full block {} expected in the control structure
    ../dllist.c:73: horizontal tab used
    

    【讨论】:

    • Vera++ 是否按照问题的第二句检查命名样式?我检查了rules in the wiki,它没有提到命名约定检查。另外,更新后的链接似乎是bitbucket.org/verateam/vera
    • 我添加了有关如何查找、构建(并使构建工作)和运行结果以及示例输出的材料。但是,也请查看另一个 stackoverflow 线程 - 您可以只使用 indent(正如 @bortzmeyer 建议的那样)并区分结果以进行可能的样式清理,这也可以用作相当严格的 git 签入挂钩。
    • 感谢更新,但Vera++ 是否检查变量名?也就是说,我可以将其配置为查找不是 camelCase 或 PascalCase 等的变量/函数吗?您的扩展答案没有涵盖这一点,我认为 GNU indent 也不会检查这一点。
    • 它看起来像规则T010查看任何给定标识符的确切组成,因此虽然它没有专门针对驼峰大小写的测试,但可以通过将其复制到新规则并添加一些 rexexp。该脚本可见于bitbucket.org/verateam/vera/src/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2011-04-09
    • 2013-03-25
    • 2021-09-22
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多