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
设置为MacroBlockEnd
和MacroBlockBegin
,但这并没有帮助。它会产生以下格式:
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:宏的缩进的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 中配置 clang-format 格式化 C++ 代码
如何使用 clang 格式自动缩进具有 4 个空格的 C++ 类?
安装了 Xcode 命令行工具的 Mac OS X 中的 clang-format 和 clang-format.py 在哪里?