【问题标题】:Can clang-format force bracing on all control statement bodies?clang 格式可以在所有控制语句主体上强制支撑吗?
【发布时间】:2020-03-18 19:28:15
【问题描述】:

IE,这个:

if (x > 5)
  return test;

总是会变成:

if (x > 5)
{
  return test;
}

我不是在谈论大括号样式(Allman、GNU、Whiteman 等),我只是指那里有大括号。

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

if (x > 5) return test;

这是AllowShortBlocksOnASingleLine,但这不是我在这里寻找的。​​p>

如果它适用于 clang 7,那是理想的,但如果不能,请告诉我。

【问题讨论】:

标签: curly-braces clang-format braces


【解决方案1】:

我同意 dovedevic 的观点,即 clang-format 目前不能这样做。要考虑的另一种选择是clang-tidy。您可以使用以下命令在控制语句周围强制使用大括号:

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

解释:

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

请参阅documentation 了解更多信息。

【讨论】:

    【解决方案2】:

    您想坚持使用clang-format 是可以理解的,但是my recent post 使我陷入了您所处的类似兔子洞。看来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
    

    如果您需要更多格式选项,他们的online config tool 有一些示例和说明,用于过多的可配置项。

    你说:

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

    恐怕从clang-format 6.0(我研究和测试的)和 7.0(我研究的)来看,这似乎是不可能的。

    【讨论】:

    • 由于一些原因,现在不能同时使用 Uncrustify 和 ClangFormat,只能使用一个。但是感谢您至少表明您对其进行了研究并且也找不到任何东西。
    • 没问题。不幸的是,您的构建过程无法集成它,但至少存在 some 解决方案,我的情况与此类似。也许您可以在某个时候找到解决方法。您是否考虑过 clang-tidy 是否可以集成到您的构建工作流程中?
    • 我相信可以。是否有可能让 clang-tidy 也以某种方式运行 clang-format 并且 在此之上做一些额外的工作?我还没有使用clang-tidy。如果我们必须尽可能少地进行更改以使其正常工作,那将是理想的。如果可以在保存文件时运行 clang-tidy,那就更好了。
    • 也许吧。你在什么环境下写源码? Windows/Mac/Linux/CLI?
    • Windows 和 Linux,QT 目前在文件保存时运行 clang-format,尽管其他人也设置了 emacs 来处理它。如果它们都可以运行clang-tidy,然后在保存支撑的东西时运行clang-format,那就太好了。
    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多