clang-format 如何忽略 extern C?

标签 clang-format

这是我当前的示例代码

#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" 放在同一行以禁用缩进extern "C" 部分。这样做需要使用 BreakBeforeBracesCustom 设置。这种禁用缩进 extern "C" block 的行为似乎没有在任何地方记录,但它确实对我有用。

尝试修改您的 .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 然后编辑文件。

关于clang-format 如何忽略 extern C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63222182/

相关文章:

c - 如何以 clang 格式对齐函数参数名称?

c++ - 如何通过在逗号后打断来制作 clang 格式换行函数?

clang-format - 函数定义之间的换行符

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

c++ - 如何使用 clang 格式控制数组初始值设定项的缩进?

c++ - 如何使用 clang-format 控制三元运算符的缩进?

git - clang-format 可以告诉我是否需要更改格式吗?

c++ - 使用 clang 格式缩进预处理器指令

c++ - 如何为 Visual Studio Clang-Format 插件提供 clang 格式文件?

formatting - 在没有 -style=file 选项的情况下调用 clang-format 的默认行为是什么?