我刚刚在Redhat 6机器上构建了clang 5.0.0并尝试运行clang-format.我无法获得样式文件中的-style选项.这是我认为应该工作的一组命令的示例:
./clang-format -style=llvm -dump-config > .llvm-format
./clang-format -style=.llvm-format ~/myFile.cc
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时,我收到以下错误:
Invalid value for -style
Run Code Online (Sandbox Code Playgroud)
当它按预期放在父目录中时,它似乎找到并使用.clang格式.内置类型也有效:
./clang-format -style=Mozilla ~/myFile.cc
Run Code Online (Sandbox Code Playgroud)
那么问题是我无法明确指定要使用的.clang格式文件.这是我的构建问题还是我滥用clang-format oir误解了文档?
我查看了 clang-format 样式选项https://clang.llvm.org/docs/ClangFormatStyleOptions.html但没有看到任何对 c++ 概念和需要子句的引用。通常我可以配置 clang-format 来做我想做的事,但我不知道如何让它很好地处理我的概念和需要条款:
template <typename F, typename P, typename T>
concept Accumulate_Fn = Parser<P>&& std::invocable<F, T, parser_t<P>>&&
std::same_as<T, std::invoke_result_t<F, T, parser_t<P>>>;
Run Code Online (Sandbox Code Playgroud)
但是我想将每个约束放在自己的行上(就像它处理太长的函数参数一样),以便结果如下所示:
template <typename F, typename P, typename T>
concept Accumulate_Fn = Parser<P> &&
std::invocable<F, T, parser_t<P>> &&
std::same_as<T, std::invoke_result_t<F, T, parser_t<P>>>;
Run Code Online (Sandbox Code Playgroud)
template <Parser P1, Parser P2, typename T, Accumulate_Fn<P1, parser_t<P1>> F>
requires std::same_as<T, parser_t<P1>> constexpr Parser auto
separated_by(P1&& p1, P2&& p2, T&& init, F&& f)
Run Code Online (Sandbox Code Playgroud)
但我想要更接近的东西: …
我有一个这样的 C++ 类:
class A {
public:
A() :
m_a(someValue1),
m_b(someValue2),
m_c(someValue3)
{
}
// .... other class members
private:
A m_a;
B m_b;
C m_c;
};
Run Code Online (Sandbox Code Playgroud)
使用 clang-format 格式化此代码后,我得到:
class A {
public:
A() :
m_a(someValue1), m_b(someValue2), m_c(someValue3)
{
}
// .... other class members
private:
A m_a;
B m_b;
C m_c;
};
Run Code Online (Sandbox Code Playgroud)
即构造函数中的初始化列表被格式化为单行,直到达到他们允许的最大行长度。
我的问题是如何告诉 clang-format 将每个元素保留在自己的行上,就像在格式化之前在我的原始代码中一样?我找不到任何合适的参数。我尝试将参数 AllowShortBlocksOnASingleLine(在我看来是最合适的)设置为 true 和 false,但这对此没有影响。那么有人可以建议如何实现这种格式吗?
这是我的 .clang 格式:
BasedOnStyle: Google
AccessModifierOffset: '-4'
AlignAfterOpenBracket: DontAlign
AlignConsecutiveAssignments: 'false'
AlignConsecutiveDeclarations: 'false'
AlignEscapedNewlines: Left
AlignOperands: 'true'
AlignTrailingComments: …Run Code Online (Sandbox Code Playgroud) 有没有办法在函数定义之间自动插入空格.例如我的初始资料来源是:
void
func1()
{
// func1 body.
}
void
func2()
{
// func2 body.
}
Run Code Online (Sandbox Code Playgroud)
我希望将其重新格式化为:
void
func1()
{
// func1 body.
}
void
func2()
{
// func2 body.
}
Run Code Online (Sandbox Code Playgroud)
如果有更多换行符,则应保留固定数量的换行符.
我有兴趣为函数添加一个开括号(但不是if语句和其他上下文).例如
void foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)
除了Flamewars之外,还有一个很好的理由不这样做吗?虽然我对if/else和less块使用相同的开放括号,但我认为在这种情况下,更大的代码单元(函数/方法/类/结构)的可视化组织可以胜过完美的一致性.
此外,我如何让clang-format遵循这种风格?
我使用clang-format格式化我们的C++代码.我想在类声明和周围命名空间的右括号之间有一个空行,如下所示:
namespace Foo {
class Bar {
};
}
Run Code Online (Sandbox Code Playgroud)
但clang格式将我的代码更改为:
namespace Foo {
class Bar {
};
}
Run Code Online (Sandbox Code Playgroud)
它删除了类声明和命名空间的右括号之间的空行.
我的问题:有没有办法防止clang格式删除空行?
这是我目前的clang格式配置:
Language: Cpp
AccessModifierOffset: -4
AlignAfterOpenBracket: true
AlignConsecutiveAssignments: false
AlignEscapedNewlinesLeft: false
AlignOperands: false
AlignTrailingComments: false
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: true
BinPackArguments: true
BinPackParameters: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeTernaryOperators: false
BreakConstructorInitializersBeforeComma: false
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 0
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: …Run Code Online (Sandbox Code Playgroud) 我有一个lambda函数格式如下:
auto cb = [](std::string const& _param)
{
std::cout << _param;
};
Run Code Online (Sandbox Code Playgroud)
我想将开口支撑保持在新线上,但clang-format始终将它放在第一行的末尾.是否可以配置clang-format为遵循上述风格?
我当前配置的相关部分如下所示:
BraceWrapping:
AfterClass: true
AfterControlStatement: true
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterStruct: true
AfterUnion: true
BeforeCatch: true
BeforeElse: true
IndentBraces: true
BreakBeforeBraces: Allman
Run Code Online (Sandbox Code Playgroud)
我也想对extern块做同样的事情:
extern "C"
{
// ...
}
Run Code Online (Sandbox Code Playgroud) clang-format 似乎总是在运算符周围添加空格。例如,以下内容:
a = b+c
Run Code Online (Sandbox Code Playgroud)
变成:
a = b + c
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉它不要在+, -, *,周围添加空格/周围添加空格?
我已经知道了SpaceBeforeAssignmentOperators(如此处所示),我正在为操作员寻找类似的东西。
类似的担忧(但方向不同)如何向 clang-format 添加功能?。
clang-format有很多关于空白的配置选项,还有一些关于代码顺序(包括的顺序).是否可以重新排序const限定符,以便将它们放在相应类型的右侧?
示例:声明const int x = 0;应格式化为int const x = 0;.
clang-format打破了80列的界限.有没有办法让止损线?文档在
http://clang.llvm.org/docs/ClangFormatStyleOptions.html
似乎没有解决这个问题.
clang-format ×10
c++ ×5
clang ×3
llvm-clang ×2
c++-concepts ×1
c++11 ×1
c++20 ×1
coding-style ×1
lambda ×1
llvm ×1