格式化foreach宏的格式与使用clang-format的循环相同

时间:2018-07-26 09:31:46

标签: c++ clang-format

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

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中的错误?

1 个答案:

答案 0 :(得分:0)

我认为您没有丢失任何东西。我同意这看起来像是list2.clear();中的错误。

格式化clang-format循环时,AfterControlStatement设置无法正常工作,BOOST_FOREACH会对其产生影响,但实际上不会。对我来说,AfterFunction设置根本不起作用,这可能是问题的一部分(当我从for-each宏列表中删除ForEachMacros时,行为是相同的。) >