如何允许 clang-format 在一行上格式化空类/结构?

Pat*_*ryk 9 c++ formatting clang-format

具有以下结构定义:

struct city
{
};
struct country
{
};
Run Code Online (Sandbox Code Playgroud)

我想要clang-format为我格式化

struct city {};
struct country {};
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我可以看到很多选项,例如AllowShortBlocksOnASingleLine, AllowShortFunctionsOnASingleLineorAllowShortIfStatementsOnASingleLine但没有AllowShortClassDefinitionsOnASingleLine(或类似)。

aaf*_*lei 6

不幸的是,从 clang-format 12 开始,您需要的单个功能已经缺失。

也就是说,如果您希望空结构/类位于一行中,那么您必须接受左大括号始终与or{位于同一行。为此,请设置structclass

BreakBeforeBraces: Custom
BraceWrapping:
  AfterClass: false
Run Code Online (Sandbox Code Playgroud)

然后你就会有

class A {};

class B {
  void foo() {}
};
Run Code Online (Sandbox Code Playgroud)

如果你想实现类似的目标

class A {};

class B 
{
  void foo() {}
};
Run Code Online (Sandbox Code Playgroud)

据我所知,恐怕 clang-format 无法做到这一点。


我将在下面讨论一些相关选项。

首先,假设我们已经设置了

BreakBeforeBraces: Custom
Run Code Online (Sandbox Code Playgroud)

如果没有这个,后面的所有选项都会被忽略。

然后,

BraceWrapping:
  AfterClass: false
Run Code Online (Sandbox Code Playgroud)

会导致

class Foo {
    // data members and member functions
};
Run Code Online (Sandbox Code Playgroud)

相比之下,

BraceWrapping:
  AfterClass: true
Run Code Online (Sandbox Code Playgroud)

会导致

class Foo 
{
    // data members and member functions
};
Run Code Online (Sandbox Code Playgroud)

现在,给定AfterClass设置为true,然后SplitEmptyRecord确定是否将空类拆分为两行。

BraceWrapping:
  SplitEmptyRecord: false
Run Code Online (Sandbox Code Playgroud)

会导致

class EmptyClass
{};
Run Code Online (Sandbox Code Playgroud)

尽管

  SplitEmptyRecord: true
Run Code Online (Sandbox Code Playgroud)

会给你

class EmptyClass
{
};
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这些都没有具体解决您的问题。

作为参考,请参阅Clang-Format 样式选项


Pav*_*bev 0

这样就可以解决问题了。

BreakBeforeBraces: Attach
Run Code Online (Sandbox Code Playgroud)

或者你可以尝试设置

BreakBeforeBraces: Custom
Run Code Online (Sandbox Code Playgroud)

并玩弄BraceWrapping. 不过,这个选项对我来说不起作用。