如何以 clang 格式对齐函数参数名称?
Posted
技术标签:
【中文标题】如何以 clang 格式对齐函数参数名称?【英文标题】:How can I align function parameter names in clang-format? 【发布时间】:2015-12-17 09:33:00 【问题描述】:是否可以使用clang-format
将结构成员和函数参数名称格式化为列?
例如:
struct
int alpha; //aligned to 'b' of "beta"
unsigned int beta;
MyObject *gamma; //aligned with 'g' not '*'
;
void foobar (int alpha, //aligned to 'b' of "beta"
unsigned int beta
MyObject *gamma) //aligned with 'g' not '*'
如果不可能,我可以以某种方式扩展 clang-format 来实现这一点吗?
【问题讨论】:
【参考方案1】:clang-format
最近(3.7 或 3.8)获得了更多调整对齐的选项,我在问题中提出的问题仍未得到完全支持,但我们现在可以更接近一点:
AlignConsecutiveDeclarations: true
对齐如上所示的声明。
不幸的是,指针星号格式的控制似乎仍然有限,请参阅clang-format: Align asterisk (*) of pointer declaration with variable name
【讨论】:
在较新版本的 clang-format 上,我更喜欢使用“AcrossEmptyLinesAndComments”而不是“true”【参考方案2】:好吧,你可以靠近。
对于函数声明:
您可以设置BinPackParameters=false
,这将强制函数声明的所有参数要么在一行,要么在不同的行,并且它们将按照您显示的方式对齐。
(但不是在类型和标识符之间使用制表位。这在目前的 clang 格式中是不可能的。)
另外,请参阅选项AllowAllParametersOfDeclarationOnNextLine
即使 BinPackParameters 为假,也允许将函数声明的所有参数放到下一行。
对于结构,我认为你不能做到这一点。
过去我自己为 clang-format 编写过补丁,我认为要按照您的建议进行对齐需要做很多工作。您必须自己编写相当多的 C++ 到 clang lib 格式才能支持这一点。
【讨论】:
我不确定这是不是真的,如果我使用BinPackParameters=false
,那么每个参数都在自己的行上对齐,但只有参数类型与它们的第一个字母对齐,而不是参数名称本身.还是我犯了一个错误?我正在使用clang-format-3.6
btw。
是的,这就是我用括号括起来的意思。我认为您不能完全按照您使用 clang 格式显示的对齐方式。
好的,我明白了,非常感谢您的回答,尤其是最后一段,因为那将是我的下一个问题。我真的很想看到这个功能,但目前我没有足够的时间来编写这样的补丁,尤其是如果它需要大量工作的话。尽管如此,该功能仍然非常有用,因为我正在编写大量代码,其中代码样式指南要求我编写对齐的函数参数和结构成员。在 git 中使用带有 pre-commit-hook 的 clang-format 会非常完美。
对制表位缺乏支持感到非常难过【参考方案3】:
跟进您的帖子,我可以得到以下信息:
struct
int alpha;
unsigned int beta;
MyObject * gamma;
;
void foobar( int alphaXXXXXXXXXX,
unsigned int betaXXXXXXXXX,
MyObject * gammaXXXXXXXX )
BinPackArguments
和 BinPackParameters
都为 false,AlignConsecutiveAssignments
和 AlignConsecutiveDeclarations
都设置为 true(这些参数中的documentation)。我不得不将变量的长度扩展到函数中,因为原来的可以将它们全部放在一行上。
【讨论】:
您能否将 MyObject 的星号*
定位在空白的右侧,就在 gamma 的 g
之前?
对不起@lanoxx 不,这还不可能:PointerAlignment 可以设置为左/右/中,但这与类型和星号之间的 one 空格有关,似乎无法将星号放在变量旁边。以上是关于如何以 clang 格式对齐函数参数名称?的主要内容,如果未能解决你的问题,请参考以下文章