Clang格式化单行连锁else if语句

8
我尝试编写一个.clang-format文件,使其可以实现以下功能:
if (value.Is<bool>()) { index = 1; }
else if (value.Is<int>()) { index = 2; }
else if (value.Is<unsigned int>()) { index = 3; }
else if (value.Is<long long>()) { index = 4; }
else if (value.Is<unsigned long long>()) { index = 5; }
else if (value.Is<float>()) { index = 6; }
else if (value.Is<double>()) { index = 7; }
else if (value.Is<long double>()) { index = 8; }
else if (value.Is<std::string>()) { index = 9; }
else if (value.IsArray()) { index = 10; }
else { index = 0; }

我尝试了与换行和allowShort*相关的所有选项,但无论我做什么,它似乎总是在第一次之后将它们分成多行,就像这样:

if (value.Is<bool>()) { index = 1; }
else if (value.Is<int>()) {
  index = 2;
}
...

我是否错过了某些选项,可以支持这个功能?

3个回答

5
很遗憾,目前仅支持简单的if语句(截至于6/4/18版本329373)。选项AllowShortBlocksOnASingleLineAllowShortIfStatementsOnASingleLine不适用于if-else语句。

希望将来会有所改变。


文档并没有明确说明这一点,只是说AllowShortIfStatementsOnASingleLine将简单的if语句放在一行上:

AllowShortIfStatementsOnASingleLine (bool)
如果为true,则if (a) return;可以放在同一行。

然而,clang-format代码表明if-else块不能放在单行中:

1)UnwrappedLineFormatter.cpptryMergeSimpleControlStatement

// Only inline simple if's (no nested if or else).
if (I + 2 != E && Line.startsWith(tok::kw_if) &&
    I[2]->First->is(tok::kw_else))
  return 0;

2) FormatTest.cppFormatShortBracedStatements测试。
请注意测试参数,并且在单元测试中的预期格式化中,else语句总是位于自己的一行,而没有else的普通if语句与它们的代码块在同一行上,例如:

verifyFormat("if (true) {\n"
             "  f();\n"
             "} else {\n"
             "  f();\n"
             "}",
  AllowSimpleBracedStatements);

1
你知道在更新的clang-format版本中有没有解决方案吗? - Jenny

1

1
对于2023年7月: 我也在寻找一种方法来保持单行的if-else语句,并且将表达式包裹在括号中。添加以下配置对我起到了作用。
AllowShortBlocksOnASingleLine: Always

文档: https://clang.llvm.org/docs/ClangFormatStyleOptions.html

文档中表示"while (true) { continue; }可以放在一行中。",但我也发现对于if (condition) { expr(); }同样有效。


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