foreach宏的格式与clang格式的循环相同

Format foreach macros the same as loops with clang-format

本文关键字:格式 循环 foreach clang      更新时间:2023-10-16

我有一个类似于BOOST_FOREACHforeach风格的宏,我希望其格式类似于以下内容:

int bar(int a) { return ++a; }
int bar(int a) {
a += 2;
return ++a;
}
int foo(std::vector<int> a) {
BOOST_FOREACH (auto i, a) {
++i;
}
for (auto &i : a) {
++i;
}
BOOST_FOREACH (auto i, a) {
++i;
i += 2;
}
for (auto &i : a) {
++i;
i += 2;
}
}

问题是,我使用的LLVM样式作为基础:

BOOST_FOREACH (auto i, a) { ++i; }
BOOST_FOREACH (auto i, a) {
++i;
i += 2;
}

即将短/单行foreach宏循环体放在单行上,尽管它不对正常的for循环这样做。

我找不到一个clang-format选项。以下是我尝试过的,从LLVM风格作为基础开始:

BreakBeforeBraces: Custom
BraceWrapping:   
AfterControlStatement: true

给出:

BOOST_FOREACH (auto i, a)
{ ++i; }
for (auto &i : a)
{
++i;
}

看起来可能是个虫子?

BreakBeforeBraces: Custom
BraceWrapping:   
AfterFunction: true

这几乎是我想要的,但它显然也会影响我不想要的功能:

int foo(std::vector<int> a)
{
BOOST_FOREACH (auto i, a) {
++i;
}
...

放置

AllowShortFunctionsOnASingleLine: false

只影响一行bar,而不影响foreach宏,所以我不认为这是因为clang-format将宏视为函数定义。

我是遗漏了什么,还是这可能是clang-format中的错误?

我认为您没有遗漏任何内容。我同意它看起来像是clang-format中的一个bug。

格式化BOOST_FOREACH循环时,AfterControlStatement设置无法正常工作,AfterFunction会影响它,但实际上不应该。对我来说,ForEachMacros设置根本不起作用,这可能是问题的一部分(当我从每个宏的列表中删除BOOST_FOREACH时,行为是相同的(。