我的代码库有很多std::variant类型和函数,用于std::visit根据实际类型实现不同的行为。
我正在使用clang-format,有时它会扰乱使用的功能std::visit。我有一个名为 的函数visitor,它从一堆 lambda 表达式中构建一个访问者。看起来,当 lambda 声明返回类型为 时auto&,clang-format决定在每个 lambda 的右大括号之后开始换行,将逗号留在左边距。
这是一个示例函数,其clang-format格式如下:
struct A {};
struct B {};
typedef std::variant<A, B> AB;
template <class... Ts>
struct visitor : Ts... {
using Ts::operator()...;
};
template <class... Ts>
visitor(Ts...) -> visitor<Ts...>;
AB& f(AB& ab) {
auto v = visitor{[&](const A& a) -> auto& {std::cout << "A" << std::endl;
return ab;
}
, [&](const B& b) -> auto& …Run Code Online (Sandbox Code Playgroud) 我正在尝试配置 .clang-format。我的目的是让它保留我的包含组,因为它们在代码中,但按字母顺序对它们进行排序。我设法接近我想要的IncludeBlocks: Preserve,但它以区分大小写的方式包含在每个块中:
这是我应用格式后得到的结果
#include "A1.h"
#include "B2.h"
#include "a2.h"
#include "b1.h"
Run Code Online (Sandbox Code Playgroud)
这就是我想要实现的目标
#include "A1.h"
#include "a2.h"
#include "b1.h"
#include "B2.h"
Run Code Online (Sandbox Code Playgroud)
我正在使用 clang-format 版本 10.0。我的 .clang 格式文件,以防相关:
---
# Brompton's Clang Format file v0.0.1
#
# Changelog:
# v0.0.1 (25/9/2020):
# - First version of this file
# Base it on Google's Standard, with 4 spaces as indentation
BasedOnStyle: Google
IndentWidth: '4'
Standard: Cpp11
UseTab: Never
# Settings for C/C++
Language: Cpp
# 120 chars per line, reflow …Run Code Online (Sandbox Code Playgroud) 我的情况是这样的:
#ifdef NOISE
#ifdef NOISE_2D
DECLARE_NOISE2D();
#else // NOISE_3D
DECLARE_NOISE3D();
#endif
#else
DECLARE_NO_NOISE();
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法让 Clang-format 查看这段代码并将其格式化为这样:
#ifdef NOISE
#ifdef NOISE_2D
DECLARE_NOISE2D();
#else // NOISE_3D
DECLARE_NOISE3D();
#endif
#else
DECLARE_NO_NOISE();
#endif
Run Code Online (Sandbox Code Playgroud)
我能做的最好的事情就是 with IndentPPDirectives: BeforeHash,结果如下:
#ifdef NOISE
#ifdef NOISE_2D
DECLARE_NOISE2D();
#else // NOISE_3D
DECLARE_NOISE3D();
#endif
#else
DECLARE_NO_NOISE();
#endif
Run Code Online (Sandbox Code Playgroud)
我还尝试在宏块开始和结束时传递预处理器指令,但似乎它们没有被拾取(值得一试)。
看起来预处理器指令和 C++ 代码都有自己的缩进树,但它们似乎并不共享。无论如何,是否有 Clang-format 提供所需的输出,或者是否有任何其他自动格式化程序能够提供此功能?
80 个字符的限制对于代码本身来说是不合理的,但对于通常以段落形式编写的块注释来说却非常好。我不知道如何配置 clang-format 并仅对块注释设置列限制。看起来有一个 ColumnLimit 选项适用于所有内容。是否可以有不同的限制?
clang-format 12 (12.0.1) 的选项是什么,它在 R 前缀和原始字符串之间放置一个空格:
std::string str = R"(raw string)";
Run Code Online (Sandbox Code Playgroud)
与
std::string str = R "(raw string)";
Run Code Online (Sandbox Code Playgroud)
gcc (9.3.0) 或 VSCode 1.62.3 使用的 clang 不接受后者,因此这实际上破坏了源文件/构建。
我的 .clang-format 文件设置会导致出现空格,内置的 gnu 预设也会出现这种情况。其他预设(llvm、google、chromium、microsoft、mozilla 或 webkit)都不会导致此问题。
我已经转储了所有格式,并逐个设置地比较了它们。我首先删除了配置中与未导致此问题的预设之一相匹配的所有设置。然后我消除了 gnu 预设和未添加空格的预设之间相同的任何剩余设置。最后,我检查了剩下的几个设置,并将 .clang-format 文件中的设置更改为工作预设中的值,以查看它们是否解决了问题,但它们没有。
这样做,我似乎已经消除了所有的设置作为原因。
在我花更多时间、几个小时挖掘实际的源代码之前,我希望有人对此有一些见解,并能够向我指出导致问题的设置。
作为参考,我在下面包含了我的 .clang-format 设置文件。但正如所指出的,gnu 预设也表现出这种行为。
谢谢你的帮助。
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: None
AlignConsecutiveBitFields: None
AlignConsecutiveDeclarations: None
AlignConsecutiveMacros: None
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: true
AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: …Run Code Online (Sandbox Code Playgroud) 我尝试在包含 boost 可序列化文件的文件上应用 clang-format (11),其内容如下
class MyClass
{
int _myNumber;
int &_myRefNumber;
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive& ar, const unsigned int /*version*/) const
{
ar & _myNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设我喜欢左边的参考,我设置PointerAlignment : Left并得到
class MyClass
{
int _myNumber;
int& _myRefNumber;
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive& ar, const unsigned int /*version*/) const
{
ar& _myNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
这对于参考来说是正确的,但也会令人讨厌地将&操作员移到左侧。是否有任何优雅的方式使用 clang-format 来使操作员在移动引用时保留空格?目前我看到的唯一方法是禁用这些行的 clang-format 。
我的团队有兴趣添加一个工具来强制执行 C++ 的样式指南。我们研究过的两个最好的选择是clang-tidy和clang-format。
clang-format 似乎可以满足我们几乎所有的需求,但是我无法确定的一件事是是否有一种方法可以使用 clang-format 配置命名约定。这可以通过 clang-tidy 使用readability-identifier-naming来完成。
clang-format 中有类似的功能吗?
我故意在行的开头提供一些注释,例如一些调试代码,并且不想缩进这些行。我同意 clang-format 根本不碰//评论。他们全部。我发现的唯一设置ReflowComments=false仍然可以识别评论。
我没有找到任何设置来不缩进注释,如果我执行以下操作
{
// clang-format off
//comment
// clang-format on
}
Run Code Online (Sandbox Code Playgroud)
已重新格式化
{
// clang-format off
//comment
// clang-format on
}
Run Code Online (Sandbox Code Playgroud)
这真是太可怕了。当然我希望那也clang-format不会碰触//clang-format off和//clang-format on线条。
我的 C++ 代码中有以下行:
std::cout << "done" << "\n";
Run Code Online (Sandbox Code Playgroud)
clang-format 会进入哪个
std::cout << "done"
<< "\n";
Run Code Online (Sandbox Code Playgroud)
无论。我编辑了以“Break”或“Align”开头的每个选项:
AlignAfterOpenBracket: DontAlign
AlignArrayOfStructures: None
AlignConsecutiveMacros: 'false'
AlignConsecutiveAssignments: 'false'
AlignConsecutiveBitFields: 'false'
AlignConsecutiveDeclarations: 'false'
AlignEscapedNewlines: DontAlign
AlignOperands: DontAlign
AlignTrailingComments: 'false'
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: false
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: AfterComma
BreakBeforeTernaryOperators: false
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: AfterColon
BreakStringLiterals: false
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它不这样做呢?版本是14.0.0
我希望clang格式不修改用于分隔功能的注释行。我认为这commentPragmas是正确的选择,但我找不到有关clang格式正则表达式格式的信息。
我试图commentPragmas: '^/\*-.*'捕获看起来像这样的分隔线
/*------------------------------------------------------------------*/
但是上述正则表达式无法正常工作...在哪里可以找到用于clang格式的正则表达式的语法?
clang-format ×10
c++ ×9
boost ×1
camelcasing ×1
clang ×1
clang-tidy ×1
format ×1
formatting ×1
rawstring ×1
regex ×1