clang-format:宏的缩进

Posted

技术标签:

【中文标题】clang-format:宏的缩进【英文标题】:clang-format: indentation of macros 【发布时间】:2018-10-30 08:53:13 【问题描述】:

我正在尝试将 clang-format 应用于现有代码库并遇到以下问题:

简化(和格式化)示例代码:

#define QUERY_BEGIN()
#define QUERY_NORESULT()
#define QUERY_END()

void foo()

   int a = 0;

   QUERY_BEGIN()
      a = 1;
      QUERY_NORESULT()
      a = 2;
   QUERY_END()

我设置了以下选项:

MacroBlockEnd:   'QUERY_END'
MacroBlockBegin: 'QUERY_BEGIN'

我想要实现的是宏部分的如下格式:

   QUERY_BEGIN()
      a = 1;
   QUERY_NORESULT()
      a = 2;
   QUERY_END()

我的第一个猜测是将QUERY_NORESULT 设置为MacroBlockEndMacroBlockBegin,但这并没有帮助。它会产生以下格式:

   QUERY_BEGIN()
      a = 1;
      QUERY_NORESULT
         a = 2;
      QUERY_END()

目前有没有办法实现如上所示的缩进?

【问题讨论】:

【参考方案1】: 坏消息:抱歉,当前版本的 clang-format(7) 不提供此功能。 好消息:有一个 StatementMacros 选项,从 clang-format 8 开始可用(尚未发布,但您可以从源代码构建)。

见this commit:

总结: 一些宏在函数体中使用,实际上包含尾随分号:因此它们应该自动跟在新行之后,而不是与下一行合并。例如,Qt 的 Q_UNUSED 宏就是这种情况:

  void foo(int a, int b) 
    Q_UNUSED(a)
    return b;
  

此补丁通过引入一个新选项来指定语句宏列表来处理这些情况。这会重新使用已经为 foreach 宏设置的系统,以确保不会影响性能。

Document:

◆语句宏

std::vector clang::format::FormatStyle::StatementMacros 应该被解释为完整语句的宏向量。

典型的宏是表达式,需要添加分号;有时情况并非如此,这可以让 clang-format 了解这种情况。

例如:Q_UNUSED

Format.h 文件第 1061 行的定义。

由 clang::format::FormatTokenLexer::FormatTokenLexer()、clang::format::getLLVMStyle()、llvm::yaml::MappingTraits::mapping() 和 operator==() 引用.

解决方案:

build clang from source/等待 llvm/clang8 发布,然后 将StatementMacros ['QUERY_BEGIN()', 'QUERY_NORESULT()', 'QUERY_END()'] 放入您的.clang-format

Workaround for old clang-format

// clang-format off
    void    unformatted_code  ;
// clang-format on

在这个宏语句中关闭 clang-format。

【讨论】:

引用的文档似乎表明“StatementMacros”设置不会影响缩进,但它避免添加分号。

以上是关于clang-format:宏的缩进的主要内容,如果未能解决你的问题,请参考以下文章

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

Xcode 中配置 clang-format 格式化 C++ 代码

Qt Creater中Clang-format的使用

Vscode clang-format插件的使用

如何使用 clang 格式自动缩进具有 4 个空格的 C++ 类?

安装了 Xcode 命令行工具的 Mac OS X 中的 clang-format 和 clang-format.py 在哪里?