clang-format 如何忽略 extern C?

clang-format how to ignore extern C?

这是我当前的示例代码

#ifdef __cplusplus
extern "C"
{
#endif

typedef enum 
{
  BUY = 1, 
  SELL = 2
} OrderAction_e; 

#ifdef __cplusplus
}
#endif

在我 运行 clang 格式之后,它正在改变如下。

#ifdef __cplusplus
extern "C"
{
#endif

  typedef enum 
  {
    BUY = 1, 
    SELL = 2
  } OrderAction_e; 

#ifdef __cplusplus
}
#endif

它为我的所有函数和 typedef 添加了额外的两个空格。

有没有我可以用来忽略外部 C 大括号的选项,这样我的代码看起来就和我上面粘贴的第一个版本的代码一样没有变化。

以下是我公司使用的clang版本

LLVM (http://llvm.org/):
  LLVM version 3.4.2

如果您使用的是更高版本的 clang-format,您可能会非常接近。但是对于 3.4.2,我不这么认为。

对于 6.0.0 版,你可以非常接近,但似乎有必要将大括号与 extern "C" 放在同一行以禁用 [=11= 的缩进] 部分。这样做需要使用 BreakBeforeBracesCustom 设置。这种禁用缩进 extern "C" 块的行为似乎没有在任何地方记录,但它确实对我有用。

尝试修改您的 .clang-format 文件以包含以下内容:

BraceWrapping:
  AfterClass:      true
  AfterControlStatement: true
  AfterEnum:       true # <-- You need this
  AfterFunction:   true
  AfterNamespace:  true
  AfterObjCDeclaration: true
  AfterStruct:     true
  AfterUnion:      true
  AfterExternBlock: false # <-- And this
  BeforeCatch:     true
  BeforeElse:      true
  IndentBraces:    false
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false
BreakBeforeBraces: Custom # <-- And this

请注意,那里有很多选项,您可以保留这些选项,但您通常会设置它们。只有 AfterEnumAfterExternBlockBreakBeforeBraces 的值对此很重要。有关这些设置的更多详细信息,请参阅 documentation

如果您还没有 .clang-format 文件,您可以先执行 clang-format -dump-config > .clang-format 然后编辑文件。