如何调整clang-format中宏定义的行续符(\)位置
解决clang-format多行宏续行符位置问题
问题场景
我代码中的多行宏在运行clang-format前格式如下:
#define assertionTriggersExit { \ std::cout.flush(); \ std::cerr.flush(); \ tarch::logging::Log::flushBeforeAssertion(); \ assert(false); \ exit(ASSERTION_EXIT_CODE); \ }
运行clang-format后,续行符\被强制对齐到列限制(120字符)位置,变成:
#define assertionTriggersExit \ { \ std::cout.flush(); \ std::cerr.flush(); \ tarch::logging::Log::flushBeforeAssertion(); \ assert(false); \ exit(ASSERTION_EXIT_CODE); \ }
我需要clang-format不修改\的位置:要么保留原始位置,要么让它距离最后一个非空格字符仅1-2个空格。
配置调整方案
核心是修改AlignEscapedNewlines选项,同时可配合WhitespaceSensitiveMacros增强格式保护:
1. 修改AlignEscapedNewlines值
当前配置中AlignEscapedNewlines: Right是导致续行符被推到列限制的直接原因,可按需求二选一修改:
若要完全保留续行符的原始位置(包括原有的空格),改为:
AlignEscapedNewlines: DontAlign该选项会让clang-format不再对齐续行符,
\会直接跟在该行最后一个非空白字符之后,原代码中\前的1-2个空格也会被保留。若要统一让续行符与内容之间仅保留必要空格(不拉伸到列限制),改为:
AlignEscapedNewlines: Left该选项会将续行符对齐到宏定义的起始缩进位置,
\与内容之间仅保留少量空格。
2. 将目标宏加入WhitespaceSensitiveMacros
为确保clang-format完全不修改宏内部的空格和续行符格式,可把assertionTriggersExit加入空格敏感宏列表:
WhitespaceSensitiveMacros: - STRINGIZE - PP_STRINGIZE - BOOST_PP_STRINGIZE - NS_SWIFT_NAME - CF_SWIFT_NAME - assertionTriggersExit
标记为空格敏感的宏,clang-format会跳过对其内部格式的修改,完全保留原始续行符位置和空格。
修改后的配置片段示例
--- Language: Cpp # ... 其他原有配置 ... AlignEscapedNewlines: DontAlign # ... 其他原有配置 ... WhitespaceSensitiveMacros: - STRINGIZE - PP_STRINGIZE - BOOST_PP_STRINGIZE - NS_SWIFT_NAME - CF_SWIFT_NAME - assertionTriggersExit # ... 其他原有配置 ... ...
效果验证
调整后,clang-format处理后的宏会保留续行符的原始位置,或让\紧贴内容(仅带1-2个空格),不会再将其拉伸到列限制位置。
内容的提问来源于stack exchange,提问作者Cherry Toska
相关产品推荐
相关产品推荐

