首页 > 解决方案 > 格式化 foreach 宏与使用 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;
  }

ie 将短/单行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

标签: c++clang-format

解决方案


我不认为你缺少任何东西。我同意它看起来像一个错误clang-format

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


推荐阅读