叮当格式在单行上链接其他 ifs



我正在尝试编写一个 .clang 格式的文件,该文件将允许以下内容:

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;
}
...

我缺少一些可以支持这一点的选项吗?

不幸的是,if-else 语句目前不支持此功能,仅适用于简单的 if(截至修订版 329373,日期为 6/4/18(。AllowShortBlocksOnASingleLineAllowShortIfStatementsOnASingleLine选项不适用于 if-else 语句。

希望这种情况将来会改变。


文档对此没有明确说明,说AllowShortIfStatementsOnASingleLine将允许在一行上显示简单的 if 语句:

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

但是,clang格式代码表明if-else块不允许在单行上:

1( UnwrappedLineFormatter.cpp,tryMergeSimpleControlStatement

// 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(格式测试.cpp,格式短括号语句测试。
请注意测试参数,并且在 unittests 的预期格式中,else 始终驻留在自己的行中,而没有 else 的纯 if 语句与其块位于一行上,例如:

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

https://clang.llvm.org/docs/ClangFormatStyleOptions.html 说:

SIS_AllIfsAndElse(在配置中:AllIfsAndElse(始终将短 ifs、else>ifs 和 else 语句放在同一行上。

if (a) return;
if (b) return;
else return;
if (c) return;
else {
return;
}

2023 年 7 月: 我还在寻找一种解决方案,以保留单行 if-else 语句,并将表达式括在括号中。添加以下配置对我有用。

AllowShortBlocksOnASingleLine: Always

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

文档指出"while (true) { continue; }可以放在一行上",但我发现它也适用于if (condition) { expr(); }

最新更新