clang-format 可以强制支持所有控制语句体吗?

Tyl*_*erg 6 curly-braces braces clang-format

IE浏览器,这个:

if (x > 5)
  return test;
Run Code Online (Sandbox Code Playgroud)

总是会变成:

if (x > 5)
{
  return test;
}
Run Code Online (Sandbox Code Playgroud)

我不是在谈论大括号样式(Allman、GNU、Whiteman 等),我只是说完全有大括号。

有一些东西可以防止/启用单行控制语句,例如:

if (x > 5) return test;

这是AllowShortBlocksOnASingleLine,但这不是我在这里寻找的东西。

如果它适用于 clang 7 那是理想的,但如果不是让我知道。

Eri*_*kus 6

我同意 dovedevic 的观点,clang-format目前还不能做到这一点。另一个需要考虑的替代方案是clang-tidy。您可以使用以下方法在控制语句周围强制使用大括号:

clang-tidy -checks='-*,readability-braces-around-statements' -fix-errors myfile.cpp
Run Code Online (Sandbox Code Playgroud)

解释:

  • 禁止-*所有检查
  • 然后readability-braces-around-statements启用一项检查
  • 然后-fix-errors告诉clang-tidy修复它发现的任何问题,即使发现编译错误

请参阅文档以获取更多信息。


dov*_*vic 1

您想要坚持使用是可以理解的clang-format,但是我最近的帖子让我陷入了与您相似的兔子洞。看起来它clang-format主要用作仅空白的格式化程序。为了得到你想要,我建议使用Uncrustify。构建过程非常简单(详细信息请参见github页面),配置如下:

$ cat .uncrustify

  # Uncrustify-0.70.1
  nl_if_brace                     = remove
  nl_brace_else                   = force
  nl_elseif_brace                 = remove
  nl_else_brace                   = remove
  nl_else_if                      = remove
  nl_before_if_closing_paren      = remove
  nl_for_brace                    = remove
  nl_while_brace                  = remove
  nl_do_brace                     = remove
  nl_brace_while                  = remove
  nl_multi_line_sparen_open       = remove
  nl_multi_line_sparen_close      = remove
  nl_after_vbrace_close           = true
  mod_full_brace_do               = force
  mod_full_brace_for              = force
  mod_full_brace_function         = force
  mod_full_brace_if               = force
  mod_full_brace_while            = force
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令对源文件运行 Uncrustify:

$ uncrustify -c /path/to/.uncrustify --no-backup example.c
Run Code Online (Sandbox Code Playgroud)

如果您需要更多格式选项,他们的在线配置工具有一些示例和大量可配置的描述。

你说:

我不是在寻找要安装的辅助工具 - 它必须与未更改的 clang-format 安装一起使用。[...]

恐怕从clang-format6.0(我研究和测试的)和 7.0(我研究的)开始,这似乎是不可能的。