当AlignConsecutiveDeclarations设置为true时,某些函数参数会奇怪地对齐:
ErrorType Layer::Construct(AbstractManagedObject* a_parent,
container::Map<utf8::String, utf8::String>& a_configuration_attributess, uint8_t a_opacity)
我希望变量声明是对齐的,而不是参数列表。如果第二行只有一个参数,我不会介意参数列表中的对齐。
这是预期的行为吗?有什么方法吗?
答案 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,功能已更改,并且它也开始对齐函数参数。