clang格式:宏缩进

时间:2018-10-30 08:53:14

标签: c++ macros clang-format

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

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

#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 个答案:

答案 0 :(得分:-1)

  • 坏消息:对不起,当前版本的clang-format(7)中没有此功能。
  • 好消息:这里有一个StatementMacros选项,自clang格式8(尚未发布,但您可以从源代码构建)开始可用。

请参见this commit

  

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

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

此修补程序通过引入新的选项来指定语句宏列表来处理这些情况。这样可以将系统重新用于foreach宏,以确保不影响性能。

Document:

  

◆StatementMacros

     

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

     

典型的宏是表达式,需要添加分号。有时情况并非如此,这可以让clang格式意识到这种情况。

     

例如: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格式。