clang-format 如何忽略外部 C?

Posted

技术标签:

【中文标题】clang-format 如何忽略外部 C?【英文标题】:clang-format how to ignore extern C? 【发布时间】:2020-08-03 00:12:58 【问题描述】:

这是我当前的示例代码

#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

它为我的所有函数和类型定义添加了额外的两个空格。

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

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

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

【问题讨论】:

【参考方案1】:

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

使用 6.0.0 版本,您可以非常接近,但似乎有必要将大括号与 extern "C" 放在同一行,以禁用 extern "C" 部分的缩进。这样做需要使用CustomBreakBeforeBraces 设置。这种禁用缩进 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 &gt; .clang-format,然后编辑该文件。

【讨论】:

以上是关于clang-format 如何忽略外部 C?的主要内容,如果未能解决你的问题,请参考以下文章

clang-format 打破 lint 注释

Visual C++ 2017,外部“C”被忽略了吗?将 C++ 代码链接到 C 库时出现 LNK2019 错误

C++ 编译器标志忽略外部库的警告但不包括目录

如何让 UIScrollView 忽略单次触摸?

如何更改 jslint(VS 2010 扩展名)以忽略文件?

使用 Android proguard 忽略外部库