Clang格式的AlignConsecutiveDeclarations奇怪的行为

时间:2018-04-10 11:37:52

标签: c++ clang-format

当AlignConsecutiveDeclarations设置为true时,某些函数参数会奇怪地对齐:

ErrorType Layer::Construct(AbstractManagedObject*                      a_parent,
                           container::Map<utf8::String, utf8::String>& a_configuration_attributess, uint8_t a_opacity)

我希望变量声明是对齐的,而不是参数列表。如果第二行只有一个参数,我不会介意参数列表中的对齐。

这是预期的行为吗?有什么方法吗?

1 个答案:

答案 0 :(得分:1)

是的,AlignConsecutiveDeclarations也会对齐函数参数。我一开始并不确定,documentation对此也不是很清楚,但是通过clang-format的source code阅读,显然函数参数对齐是设计的:

void WhitespaceManager::alignConsecutiveDeclarations() {
  ...
  AlignTokens(Style,
              [](Change const &C) {
                return C.Tok->is(TT_StartOfName) ||             // <-- variables
                       C.Tok->is(TT_FunctionDeclarationName) || // <-- parameters
                       C.Tok->is(tok::kw_operator);
              },
  ...

你的例子中的确切对齐,我无法重现(尝试过clang-format 5.0,6.0) - 对我来说,它将每个函数参数放在一行中:

ErrorType Layer::Construct(
    AbstractManagedObject *                     a_parent,
    container::Map<utf8::String, utf8::String> &a_configuration_attributess,
    uint8_t                                     a_opacity);

AlignConsecutiveDeclarations: true可能与您的clang格式配置中的其他参数冲突,这会给出您所看到的结果。确保BinPackParameters设置为false - 如果超出列限制,则应强制将函数参数拆分为单独的行:

  

BinPackParameters (bool)

     

如果为false,则函数声明或函数定义的参数将全部位于同一行,或者每行都有一行。

如果您希望完全避免功能参数对齐,并且愿意降级您的clang格式版本,则可以使用clang-format 4.0。 AlignConsecutiveDeclarations选项是在3.8版本中引入的,当时它没有对齐函数参数 - 只是连续的变量声明。将您的示例提供给clang-format 3.8会得到以下结果:

ErrorType Layer::Construct(
    AbstractManagedObject *a_parent,
    container::Map<utf8::String, utf8::String> &a_configuration_attributess,
    uint8_t a_opacity);

在以下版本3.9和4.0中,AlignConsecutiveDeclarations参数的功能保持不变。启动clang-format 5.0,功能已更改,并且它也开始对齐函数参数。