我正在研究使用 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 格式的分支可以让您更好地控制这些结构?
还有其他工具可以解决问题吗?
有一些事情阻止我切换到 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) 我最近决定.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 默认值不变?
我正在尝试编写一个允许以下内容的 .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) 我有一个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) 文件中是否有任何官方指令.clang-format来排除申请目录?
项目有时使用git submodule,但运行clang-format所有目录然后用于git checkout撤消子模块文件夹中的更改是没有用的。
我找到了一些相关链接:
但他们似乎不是官方的。
我有以下 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(版本 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++ 代码:
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) 限定符也很好)。
在像 那样的 JavaScript 代码中{ foo: bar },有没有办法让 clang-format 保留大括号内的空格?
我已经非常仔细地研究了clang-format 文档,最接近的是SpacesInContainerLiterals,但这只会在括号内放置空格,例如[ 1, 2 ](也是我的要求)但删除括号内的空格。(该配置还在大括号内的冒号周围添加了空格,这是我不能拥有的)。
clang-format ×10
c++ ×7
formatting ×2
coding-style ×1
curly-braces ×1
git ×1
javascript ×1
llvm ×1
scripting ×1