带有叮当格式选项的奇怪结果总是BreakAfterReturnType和AfterFunction CLAN格式版本90.1,适用于C++代码.< /P>

带有叮当格式选项的奇怪结果总是BreakAfterReturnType和AfterFunction CLAN格式版本90.1,适用于C++代码.< /P>,c++,clang-format,C++,Clang Format,AlwaysBreakAfterReturnType和AfterFunction的组合给了我奇怪的结果。与不同选项的交互似乎相当微妙,所以我想知道我需要做什么才能得到我想要的结果(即将到来) 首先是正在格式化的代码 intfoo(int,double); int条(int,double){return 42;} 模板XY xy1(X,Y Y){返回XY{};} 模板XY xy2(X,Y){返回XY{};} 请注意,函数xy1和xy2之间的唯一区别在于xy1提供了最后一个参数的名称,而xy2没有

AlwaysBreakAfterReturnType
AfterFunction
的组合给了我奇怪的结果。与不同选项的交互似乎相当微妙,所以我想知道我需要做什么才能得到我想要的结果(即将到来)

首先是正在格式化的代码

intfoo(int,double);
int条(int,double){return 42;}
模板XY xy1(X,Y Y){返回XY{};}
模板XY xy2(X,Y){返回XY{};}
请注意,函数
xy1
xy2
之间的唯一区别在于
xy1
提供了最后一个参数的名称,而
xy2
没有命名其任何参数

接下来是最小.clang格式文件的内容

---
BasedOnStyle:  LLVM
AlwaysBreakAfterReturnType: TopLevelDefinitions
---
BasedOnStyle:  LLVM
AlwaysBreakAfterReturnType: TopLevelDefinitions
BraceWrapping:
    AfterFunction:   true
BreakBeforeBraces: Custom
运行clangformat将按如下方式格式化原始代码

intfoo(int,double);
int
条形图(整数,双精度){
返回42;
}
模板
XY
xy1(X,Y){
返回XY{};
}
模板
XY
xy2(X,Y){
返回XY{};
}
但是,我希望函数的开头大括号位于它自己的行上,而不是仅放在函数的右侧

在文档中,我应该将
BraceWrapping/AfterFunction
设置为true,从而生成以下.clang格式的文件

---
BasedOnStyle:  LLVM
AlwaysBreakAfterReturnType: TopLevelDefinitions
---
BasedOnStyle:  LLVM
AlwaysBreakAfterReturnType: TopLevelDefinitions
BraceWrapping:
    AfterFunction:   true
BreakBeforeBraces: Custom
这将导致以下格式化结果

intfoo(int,double);
int
条形图(整数,双精度)
{
返回42;
}
模板
XY
xy1(X,Y)
{
返回XY{};
}
模板XY xy2(X,Y){返回XY{};}
这就是我所期望的,除了函数
xy2
的格式,它与我所期望的完全不同,甚至与我所期望的
xy1
的格式也不接近

如果我走得更远一点,强制中断模板,那么我最终会得到这个.clang格式的文件

---
BasedOnStyle:  LLVM
AlwaysBreakAfterReturnType: TopLevelDefinitions
AlwaysBreakTemplateDeclarations: Yes
BraceWrapping:
    AfterFunction:   true
BreakBeforeBraces: Custom
它将生成此格式化输出

intfoo(int,double);
int
条形图(整数,双精度)
{
返回42;
}
模板
XY
xy1(X,Y)
{
返回XY{};
}
模板
XY xy2(X,Y)
{
返回XY{};
}
这更接近,但是
xy2
的格式设置完全忽略返回类型之后的中断请求

不同选项之间微妙的交互有点让人困惑,我还没能想出一种方法来得到我想要的,基本上就是对于没有显式参数的函数,其格式与那些有显式参数的函数相同

再次注意
xy1
xy2
之间的细微差别
xy1
至少有一个命名参数,而
xy2
没有任何命名参数,但
bar
也没有

还请注意,常规函数
bar
没有任何命名参数,但格式正确,而函数模板
xy2
的格式仍然不正确

什么神奇的选项组合会使
xy2
的格式与
xy1
bar
相同


谢谢。

在我自己做了一点实验之后,我非常确定没有“神奇组合”。clang格式似乎有一个缺少参数名的问题

我打开了一个bug报告:

同时:

如果可以使用C++17,则可以通过在第二个模板函数中使用
[[maybe_unused]]]
属性来解决此问题:

template <typename T, typename U> 
XY<T, U> 
xy2([[maybe_unused]] X x, Y)
{
  return XY<T, U>{};
}
模板
XY
xy2([[可能未使用]]X,Y)
{
返回XY{};
}
(使用上次配置)