最近在做项目时碰到一个需求,将多个板子的头文件定义合并,并整理其格式,大概内容像下面这样:
#if defined board_1
#define A 00//注释
#define B 11// 注释
//注释
#define CCCC 22//注释
#define DDDD 33
//注释
#endif
#if defined board_2
//注释
#define EEEEEEEEEEEEE 22 // 注释
/*
* 块注释
*/
#define FFFFFFFF 33 // 注释
#define GG 4455
/****************************/
#endif
在头文件中,有许多的空行,块注释和行注释,以及条件定义语句,宏的长度也不固定。调整格式时希望能够将所有的注释位置对齐,将所有宏的值和定义也对齐,在clang-format中,支持连续的宏对齐,并且可以定义为跨空行和跨注释对齐。只需要调整clang-format的以下参数为:
# 宏对齐
AlignConsecutiveMacros: AcrossEmptyLinesAndComments
# 对齐连续的尾随的注释
AlignTrailingComments: true
# 连续空行的最大数量
MaxEmptyLinesToKeep: 1
# 在尾随的评论前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 1
设置完成后,保存clang-format,在vscode中选中代码,CTRL-K CTRL-F 就可以将宏和注释以及多余的空行取消掉了,格式化后的结果如下:
#if defined board_1
#define A 00 //注释
#define B 11 //注释
//注释
#define CCCC 22 //注释
#define DDDD 33
//注释
#endif
#if defined board_2
//注释
#define EEEEEEEEEEEEE 22 // 注释
/*
* 块注释
*/
#define FFFFFFFF 33 // 注释
#define GG 4455
/****************************/
#endif
格式化代码后发现,并没有达到完全理想的效果,代码块被条件定义语句分隔开了,查找了很多资料,没有找到解决的办法,最后想了一个笨办法:
在格式化前用一个特定的字符串 将条件定义语句替换为注释语句,我这里是将#if 替换为//if,将#endif 替换为//endif,完成替换后,重新格式化。
//if defined board_1
#define A 00 //注释
#define B 11 //注释
//注释
#define CCCC 22 //注释
#define DDDD 33
//注释
//endif
//if defined board_2
//注释
#define EEEEEEEEEEEEE 22 // 注释
/*
* 块注释
*/
#define FFFFFFFF 33 // 注释
#define GG 4455
/****************************/
//endif
最后再将#if 和#endif替换回去,就可以了