标签: clang-format

更好地支持嵌套 C++ 模板的 clang 格式

我正在研究使用 clang-format 来强制执行 C++ 代码风格。它主要符合我的要求,除了它几乎没有用于格式化复杂模板结构的设置,例如

template<typename ... params> 
    std::enable_if<
        std::is_same<...,...>::value ||
        std::is_same<...,...>::value,
        void>::type
Run Code Online (Sandbox Code Playgroud)

是否有任何 clang 格式的分支可以让您更好地控制这些结构?

还有其他工具可以解决问题吗?

c++ clang-format

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

如何使用 clang-format 隔开 lambda 的尾随返回类型

有一些事情阻止我切换到 clang 格式。当我在 lambda 上有一个尾随返回类型应该换行到下一行时,箭头和尾随返回类型之间没有空格。我怎样才能解决这个问题?

例如,这是下面相同代码的未格式化版本的 clang-format 的输出

auto func() {
    return [.......](auto one, auto long_parameter_list, auto another)
        ->SomeLongReturnType;
//      ^^^^^^^^^^^^^^^^^^^^^ How can I add a space in between those?
}
Run Code Online (Sandbox Code Playgroud)

c++ clang-format

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

仅当当前行溢出 clang 格式时才支持新行

我最近决定.clang-format在我的 C++ 项目中包含一个文件,以使代码更加统一和易于阅读。我最喜欢谷歌的默认设置,除了我想使用 4 个空格缩进而不是两个。

这样做的问题是当当前行超出 80 个字符的列限制时,它会使某些语句更难阅读。例如,在溢出的 if 语句中:

if (some_condition || some_other_condition ||
    yet_another_condition) {
    // block starts here
}
Run Code Online (Sandbox Code Playgroud)

对齐方式yet_another_condition与 if 块开头的对齐方式相匹配,这使得在没有某种中断的情况下很难阅读。理想情况下,我希望在这种情况下发生的事情是这样的:

if (some_condition || some_other_condition ||
    yet_another_condition)
{
    // block starts here
}
Run Code Online (Sandbox Code Playgroud)

但是,当当前行溢出到下一行时,我只希望在新行上打开大括号,就像上面的例子一样。在所有其他情况下,我希望左括号在同一行上(这适用于 if/for/while/switch 等语句以及函数)。

是否可以在我的.clang-format文件中指定此行为,同时保持其余 Google 默认值不变?

c++ formatting curly-braces google-style-guide clang-format

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

Clang 格式在单行上链接其他 ifs

我正在尝试编写一个允许以下内容的 .clang 格式文件:

if (value.Is<bool>()) { index = 1; }
else if (value.Is<int>()) { index = 2; }
else if (value.Is<unsigned int>()) { index = 3; }
else if (value.Is<long long>()) { index = 4; }
else if (value.Is<unsigned long long>()) { index = 5; }
else if (value.Is<float>()) { index = 6; }
else if (value.Is<double>()) { index = 7; }
else if (value.Is<long double>()) { index = 8; }
else if (value.Is<std::string>()) { index = 9; }
else …
Run Code Online (Sandbox Code Playgroud)

c++ clang-format

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

如果它们太长,clang 格式会堆叠所有 if 语句参数

我有一个if声明有几个ored 参数。为了便于阅读,我将它们垂直堆叠如下。

    if (health.flag_a || 
       health.flag_b ||
       health.flag_c ||
       health.flag_d ||
       health.flag_e ||
       health.flag_f ||
       health.flag_g ||
       health.flag_h ||
       health.flag_i ||
       health.flag_k) {
    do_something();
    return false;
}
Run Code Online (Sandbox Code Playgroud)

clang-format 将其转换为:

if (health.flag_a || health.flag_b || health.flag_c || health.flag_d || health.flag_e || health.flag_f || health.flag_g || health.flag_h ||
    health.flag_i || health.flag_k) {
    do_something();
    return false;
}
Run Code Online (Sandbox Code Playgroud)

clang-format如果它们不适合在一条线上,我想像上面那样堆叠它们。我希望BinPackArguments这样做,但我没有任何运气。

这能实现吗?

.clang-format下面看我的。

谢谢你的帮助。

---
Language:        Cpp
# BasedOnStyle:  Google
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: true …
Run Code Online (Sandbox Code Playgroud)

c++ formatting clang-format

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

排除目录 clang 格式

文件中是否有任何官方指令.clang-format来排除申请目录?

项目有时使用git submodule,但运行clang-format所有目录然后用于git checkout撤消子模块文件夹中的更改是没有用的。

我找到了一些相关链接:

但他们似乎不是官方的。

git scripting clang-format

5
推荐指数
2
解决办法
4713
查看次数

clang-format 似乎忽略了 CommentPragmas

我有以下 CommentPragmas 设置:

CommentPragmas: 'MARKER'
Run Code Online (Sandbox Code Playgroud)

我希望这会使 clang-format(版本 8.0.0)忽略这段代码中的注释:

    enum bar {
    // MARKER: foo
        hello = 1
    // MARKER: foo
    };
Run Code Online (Sandbox Code Playgroud)

但是,clang-format 会缩进这些注释(将它们与 对齐hello = 1)。难道我做错了什么?

clang-format

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

使用 clang 格式的“BreakConstructorInitializers: AfterColon”

我尝试使用 clang-format(版本 6.0.0)重新格式化一些 C++ 代码。大多数事情似乎工作正常。但是我在构造函数初始化列表中失败了。

这就是我所拥有的:

A::A(const char* message) : B(message)
{
}
Run Code Online (Sandbox Code Playgroud)

这就是我要的:

A::A(const char* message) : 
   B(message)
{
}
Run Code Online (Sandbox Code Playgroud)

我尝试了一个带有两个选项的 clang 格式文件:

ColumnLimit: '160'
BreakConstructorInitializers: AfterColon
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

A::A(const char *message) : B(message) {}
Run Code Online (Sandbox Code Playgroud)

但我想在冒号后换行。

事实证明,删除该ColumnLimit选项(或将其设置为0)可以解决问题,并且我得到了我想要的格式。但我打算限制行长,所以我需要ColumnLimit.

我的错误在哪里?该ColumnLimit选项是否应该BreakConstructorInitializers以如此戏剧性的方式影响行为?或者这是一个错误?

更新:刚刚尝试了 7.0.1 版。结果一样。

c++ llvm clang-format

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

将单行方法的大括号与 clang 格式对齐

假设我有以下 C++ 代码:

class Foo
{
   auto foo() { return 0; } // foo
   auto foofoo() const { return 1000; } // foofoo
   int bar() const { return 42; } // bar
};
Run Code Online (Sandbox Code Playgroud)

如何获得用于对齐大括号(以及注释)的 clang 格式:

class Foo
{
   auto foo()          { return 0;    } // foo
   auto foofoo() const { return 1000; } // foofoo
   int  bar()    const { return 42;   } // bar
   //            ^-----^--------------^  ALIGNED
};
Run Code Online (Sandbox Code Playgroud)

(实际上,对齐连续的方法 ( const) 限定符也很好)。

c++ clang-format

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

clang-format 可以在 JavaScript 对象文字的大括号内放置空格吗?

在像 那样的 JavaScript 代码中{ foo: bar },有没有办法让 clang-format 保留大括号内的空格?

我已经非常仔细地研究了clang-format 文档,最接近的是SpacesInContainerLiterals,但这只会在括号内放置空格,例如[ 1, 2 ](也是我的要求)但删除括号内的空格。(该配置还在大括号内的冒号周围添加了空格,这是我不能拥有的)。

javascript coding-style clang-format

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