标签: clang-format

为什么 clang-format 会搞砸这段代码?

我的代码库有很多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)

c++ clang clang-format

5
推荐指数
0
解决办法
393
查看次数

使 clang 格式的订单以不区分大小写的方式包含

我正在尝试配置 .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)

c++ clang-format

5
推荐指数
1
解决办法
3365
查看次数

让代码缩进遵循预处理器指令缩进

我的情况是这样的:

#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 提供所需的输出,或者是否有任何其他自动格式化程序能够提供此功能?

c++ formatting c-preprocessor clang-format

5
推荐指数
0
解决办法
543
查看次数

可以为块注释和代码配置不同的列限制的 clang-format 吗?

80 个字符的限制对于代码本身来说是不合理的,但对于通常以段落形式编写的块注释来说却非常好。我不知道如何配置 clang-format 并仅对块注释设置列限制。看起来有一个 ColumnLimit 选项适用于所有内容。是否可以有不同的限制?

c++ clang-format

5
推荐指数
0
解决办法
790
查看次数

clang-format (12.0.1) 的什么设置不会在 R 前缀和 C++ 中的原始字符串之间添加空格?

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)

c++ rawstring clang-format

5
推荐指数
1
解决办法
846
查看次数

Clang-Format 错误检测 &amp; 运算符(增强序列化)

我尝试在包含 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++ boost clang-format

5
推荐指数
0
解决办法
98
查看次数

如何使用 clang-format 配置命名约定?

我的团队有兴趣添加一个工具来强制执行 C++ 的样式指南。我们研究过的两个最好的选择是clang-tidyclang-format

clang-format 似乎可以满足我们几乎所有的需求,但是我无法确定的一件事是是否有一种方法可以使用 clang-format 配置命名约定。这可以通过 clang-tidy 使用readability-identifier-naming来完成。

clang-format 中有类似的功能吗?

c++ camelcasing naming-conventions clang-format clang-tidy

5
推荐指数
0
解决办法
3873
查看次数

强制 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++ format clang-format

5
推荐指数
0
解决办法
350
查看次数

clang-format:不要在字符串和 &lt;&lt; 运算符之间中断

我的 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

c++ clang-format

5
推荐指数
1
解决办法
181
查看次数

lang格式正则表达式语法参考

我希望clang格式不修改用于分隔功能的注释行。我认为这commentPragmas是正确的选择,但我找不到有关clang格式正则表达式格式的信息。

我试图commentPragmas: '^/\*-.*'捕获看起来像这样的分隔线

/*------------------------------------------------------------------*/

但是上述正则表达式无法正常工作...在哪里可以找到用于clang格式的正则表达式的语法?

regex clang-format

4
推荐指数
1
解决办法
779
查看次数