C++ 铿锵格式:宏缩进

C++ 铿锵格式:宏缩进,c++,macros,clang-format,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:

我试图将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\u NORESULT
设置为
MacroBlockEnd
MacroBlockBegin
,但这没有帮助。它会产生以下格式:

   QUERY_BEGIN()
      a = 1;
      QUERY_NORESULT
         a = 2;
      QUERY_END()
目前是否有办法实现上述缩进?

  • 坏消息:抱歉,这在当前版本的clang format(7)中不可用
  • 好消息:有一个
    StatementMacros
    选项,它从clang format 8(尚未发布,但您可以从源代码构建)开始提供
见:

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

  void foo(int a, int b) {
    Q_UNUSED(a)
    return b;
  }
此修补程序通过引入一个新选项来指定语句宏列表来处理这些情况。这将重新使用foreach宏已有的系统,以确保不会影响性能

◆ 语句宏

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

典型的宏是表达式,需要添加分号;有时情况并非如此,这允许clang格式了解此类情况

例如:Q_UNUSED

文件格式.h第1061行的定义

由clang::format::FormatTokenLexer::FormatTokenLexer()、clang::format::getLLVMStyle()、llvm::yaml::MappingTraits::mapping()和运算符==()引用

解决方案: /等待llvm/clang8发布,然后 将
语句宏['QUERY\u BEGIN()'、'QUERY\u NORESULT()'、'QUERY\u END()']
放入
的.clang格式中


关闭此宏语句中的clang格式。

引用的文档似乎表明“StatementMacros”设置不会影响缩进,但它避免了添加分号。
// clang-format off
    void    unformatted_code  ;
// clang-format on