clang-format:将指针声明的星号 (*) 与变量名对齐

Posted

技术标签:

【中文标题】clang-format:将指针声明的星号 (*) 与变量名对齐【英文标题】:clang-format: Align asterisk (*) of pointer declaration with variable name 【发布时间】:2016-11-18 11:22:22 【问题描述】:

我在 .clang-format 文件中使用以下选项:

AlignConsecutiveDeclarations: true
PointerAlignment: Right

当前格式化结果如下:

char *         var1;
SomeOtherType *var2;
int            var3;

我期待的结果是:

char          *var1; //note the changed position of * 
SomeOtherType *var2;
int            var3;

我如何配置 clang-format 以将星号 (*) 与变量名对齐,而不是与类型对齐 使用AlignConsecutiveDeclarations 选项?

【问题讨论】:

【参考方案1】:

很遗憾,PointerAlignment: Right 尚未实现。

见https://github.com/llvm/llvm-project/blob/master/clang/lib/Format/WhitespaceManager.cpp#L643

void WhitespaceManager::alignConsecutiveDeclarations() 
  if (!Style.AlignConsecutiveDeclarations)
    return;

  // FIXME: Currently we don't handle properly the PointerAlignment: Right
  // The * and & are not aligned and are left dangling. Something has to be done
  // about it, but it raises the question of alignment of code like:
  //   const char* const* v1;
  //   float const* v2;
  //   SomeVeryLongType const& v3;

  AlignTokens(Style, [](Change const &C)  return C.IsStartOfDeclName; ,
              Changes);

【讨论】:

这仍然适用。想知道它是否会被修复? 我想知道reviews.llvm.org/D27651 发生了什么,它早在 2016 年就实现了右对齐。 仍然没有以clang-format 13.0.0实现【参考方案2】:

现在解决了!

评论https://reviews.llvm.org/D27651已在https://reviews.llvm.org/D103245重新申请并在https://reviews.llvm.org/rG3e333cc82e42e1e2ecc974d896489eebe1a5edc2提交。

此更改将包含在 LLVM 13 版本中。

【讨论】:

嗨 Marek,它对我不起作用。我正在使用 clang 格式 13.0.0。我使用“PointerAlignment:Right”,但星号仍向左对齐 - 与类型名称对齐。 Alexey,那你应该报告一个错误。 github.com/llvm/llvm-project/labels/clang-format

以上是关于clang-format:将指针声明的星号 (*) 与变量名对齐的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的星号“*” 都有啥作用,含代码提问 求帮忙读一行程序

学c第十一天,入坑了。指针

在一条指令中声明更多指针的运算符优先级

C++ 指向指针的指针

指针的指针&指向指针数组的指针

c语言如何将两个变量关联起来