clang-format 对已格式化的文件进行更改

标签 c llvm code-formatting clang-format idempotent

当两次使用 clang-format 命令行工具格式化同一个文件时,两次都会进行更改。

我的理解是,一旦格式化,尝试重新格式化同一个文件应该不会产生任何变化。

这是我运行的测试:

输入文件

$ cat test.c 
//********************************************** AAAAAAA BBBB***************************************************//
  1. 第一种格式 - 按预期进行更改
$ clang-format -i test.c 
$ cat test.c 
//********************************************** AAAAAAA
//BBBB***************************************************//
  1. 第二种格式 - 第二行的意外更改(在 BBBB 之前添加了额外的空格)**
$ clang-format -i test.c 
$ cat test.c 
//********************************************** AAAAAAA
// BBBB***************************************************//
  1. 第三种格式 - 最终产生相同的结果。

我使用的版本是:10.0.0-++20200323042644+d32170dbd5b-1~exp1~20200323154014.129 on Ubuntu 18.04.2(请注意,我管理也可以在 clang-format-9 中重现此行为)

这是我遇到的错误,还是我最初的假设不正确?

编辑: 也可在 10.0.1-++20200507062652+bab8d1790a3-1~exp1~20200507163249.158 中重现

最佳答案

我可以重现这种幂等性的缺失。您可以在这里做三件事:使用不同的样式、使用更少的规则或将其作为错误归档。

1。使用不同的风格

clang-format 附带的样式10.0.0 列在 --help 中:

 --style=<string>           - Coding style, currently supports:
                                 LLVM, Google, Chromium, Mozilla, WebKit.

其中 LLVM 是默认值。要指定样式,请使用 clang-format --style=<style> ... .除 Webkit 之外的所有样式都会重现此错误(但 webkit 样式不会更改初始文件):

$ clang-format --style=webkit test.c > test2.c
$ clang-format --style=webkit test2.c > test3.c
$ diff test2.c test3.c
$ 

您的情况可能有所不同,因为您说过这是您遇到的众多幂等性问题之一。

2。使用规则子集

每种样式都包含您可以修改以满足您的需要的规则。您可以使用 llvm 转储当前配置(默认 clang-format --dump-config ) .

$ clang-format --dump-config | tee .clang-format
---
Language:        Cpp
# BasedOnStyle:  LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false

<output truncated> 

您可以手动选择 these rules 的较小子集|使用或消除规则,直到实现幂等性。

如果你把这个 .clang-format修改后的项目根目录下的文件,然后你可以告诉 clang-format--style=file 寻找它.请注意,您可以输入 .clang-format如果您希望在该目录中应用不同的格式规则,则将文件放在子目录中。

3。提交错误

您问题的关键组成部分之一是 clang-format 是否处理缺少 idempotency作为错误。情况就是这样,根据将此问题视为错误的评论0 , 1 .

我可以在 Macos 的 10.0.0 上复制它。根据 bug report docs 中的介绍,您拥有将其作为错误归档所需的所有信息。 .显然,此选项要求您等到修复程序可用。

关于clang-format 对已格式化的文件进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61754044/

相关文章:

c - 不同的编译方式导致同一个动态库产生不同的结果

c++ - Clang 搜索路径文件

android - 缺少 sync_val_compare_and_swap_1

c++ - 是否有任何工具可以标准化 C++ 代码的格式?

ios - 如何为 iOS 编码配置 Allman 风格的 Clang 格式?

c - 使用 OpenACC 并行化嵌套循环

c - Bash 扩展在 popen 中不起作用

c++ - 如何在没有第三方软件的情况下轮询鼠标宏键?

llvm - 在 LLVM 中向函数添加参数

regex - 如何从 Visual Studio Code 中的多个文件中删除多个空格/换行符?