如何配置clang-format仅对齐同类型的连续声明?
clang-format 仅对齐typedef声明的配置方案
问题背景
现有C代码片段:
typedef unsigned char BOOL; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; int main() { return 0; }
想要通过clang-format对齐所有typedef声明,设置AlignConsecutiveDeclarations: true和AcrossEmptyLines: true后,格式化结果意外将main函数也与typedef对齐:
typedef unsigned char BOOL; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; int main() { return 0; }
期望实现的格式化效果是仅对齐typedef,main函数保持原有格式:
typedef unsigned char BOOL; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; int main() { return 0; }
解决方案
clang-format 目前没有专门识别声明类型(如区分typedef和函数声明)的配置项,但可以通过调整AlignConsecutiveDeclarations的取值来实现需求:
- 将
AlignConsecutiveDeclarations设为Consecutive(而非true/All),同时保持AcrossEmptyLines为默认的false。
对应的配置片段:
AlignConsecutiveDeclarations: Consecutive
原理说明
AlignConsecutiveDeclarations的不同取值逻辑:
true/All:会对齐所有可见的声明,包括跨空行、跨注释的声明,这就是导致main函数被对齐的原因。Consecutive:仅对齐连续的、没有空行或注释分隔的声明。由于typedef块和main函数之间有空行,两者会被视为独立的声明块,因此main不会被纳入对齐范围。
如果必须保留AcrossEmptyLines的需求(比如希望对齐跨空行的typedef),可以通过添加注释临时禁用格式化来规避:
typedef unsigned char BOOL; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; // clang-format off int main() { return 0; } // clang-format on
但这种方式需要手动添加注释,不如调整配置来得简洁。
内容的提问来源于stack exchange,提问作者ultrapoci
相关产品推荐
相关产品推荐

