clang-format能强制所有控制语句体都使用大括号吗?

6

IE,指的是:

if (x > 5)
  return test;

始终会成为:

if (x > 5)
{
  return test;
}

我不是在谈论括号风格(Allman,GNU,Whiteman等),我只是指有没有括号。
有一些内容可以防止/启用单行控制语句,例如:
if (x > 5) return test;
这个内容是AllowShortBlocksOnASingleLine,但这不是我想要的。
如果它适用于clang 7,那就太理想了,但如果不适用,请告诉我。

这个回答解决了你的问题吗?Clang格式化程序是否可以为单行if语句等添加大括号? - cigien
3个回答

5

我同意dovedevic的看法,目前clang-format无法实现此功能。另一个值得考虑的选择是clang-tidy。您可以使用以下方法强制控制语句周围的大括号:

clang-tidy -checks='-*,readability-braces-around-statements' -fix-errors myfile.cpp

解释:

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

有关更多信息,请参见文档


2
即将发布的clang 15提供了选项InsertBraces,这个选项应该正好符合您的要求。
描述:
Insert braces after control statements (if, else, for, do, and while) in C++ unless the control statements are inside macro definitions or the braces  would enclose preprocessor directives.

(https://clang.llvm.org/docs/ClangFormatStyleOptions.html)


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

您可以使用以下命令对源文件运行Uncrustify:
$ uncrustify -c /path/to/.uncrustify --no-backup example.c

如果你需要更多格式选项,在线配置工具提供了大量可配置的示例和描述。
你说:

我不想安装第二个工具——它必须适用于未修改的clang-format安装。[...]

恐怕到目前为止(我研究并测试了clang-format 6.0,以及我研究过的7.0),这似乎是不可能的。

由于一些原因,目前无法同时使用Uncrustify和ClangFormat,只能选择其中一个。但是感谢您至少表明您已经进行了研究,并且也没有找到任何信息。 - Tyler Shellberg
没问题。很遗憾您的构建过程无法集成此功能,但至少某些解决方案存在,我曾经处于类似的情况。也许您可以在某个时候找到一个解决方法。您是否研究过clang-tidy是否可以集成到您的构建工作流程中? - dovedevic
我相信可以。是否可能让clang-tidy在运行clang-format的同时进行一些额外的工作?我还没有使用过clang-tidy。如果我们需要尽可能少地更改才能使其正常工作,那将是理想的。如果可以在保存文件时运行clang-tidy,那就更好了。 - Tyler Shellberg
Windows和Linux都可以使用QT,目前正在运行clang-format以在文件保存时进行格式化,但其他人也可以设置emacs来处理。如果两者都可以运行clang-tidy,那么在保存时就会运行clang-format和大括号的内容,这将非常方便。 - Tyler Shellberg
另外,如果您在保存时运行QT的clang-format,那么您不能重新配置它正在运行的可执行文件吗? - dovedevic
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接