如何以 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 )


BinPackArgumentsBinPackParameters 都为 false,AlignConsecutiveAssignmentsAlignConsecutiveDeclarations 都设置为 true(这些参数中的documentation)。我不得不将变量的长度扩展到函数中,因为原来的可以将它们全部放在一行上。

【讨论】:

您能否将 MyObject 的星号 * 定位在空白的右侧,就在 gamma 的 g 之前? 对不起@lanoxx 不,这还不可能:PointerAlignment 可以设置为左/右/中,但这与类型和星号之间的 one 空格有关,似乎无法将星号放在变量旁边。

以上是关于如何以 clang 格式对齐函数参数名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数与 emacs 中的函数对齐?

C语言函数定义和说明的格式

Visual Studio Code 在多行上对齐函数参数

Clang:通过内联汇编获取函数的参数

days04--方法(函数)

print输出格式总结