【问题标题】:clang-format: indentation of macrosclang-format:宏的缩进
【发布时间】: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()

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

【问题讨论】:

    标签: c++ macros clang-format


    【解决方案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”设置不会影响缩进,但它避免添加分号。
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2022-10-18
    • 2022-12-23
    • 1970-01-01
    • 2019-06-18
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多