带有叮当格式选项的奇怪结果总是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{};
}
(使用上次配置)