使用Clang-Format排序include后出现意外空行如何解决
Clang-Format首次格式化include块后多空行问题解决方案
问题根因
该现象由clangd扩展的内置include排序逻辑与Clang-Format原生格式化逻辑的执行顺序冲突导致:
clangd默认会在调用Clang-Format执行全量格式化前,先单独运行一次内置的include排序预处理,这一步不会同步处理include块末尾的空行计数;后续Clang-Format正式执行格式化时,会把预处理阶段残留的换行标记和代码原有空行叠加,就出现了首次格式化多一行空行的问题。第二次格式化时include已经完成排序,不会触发前置的预处理步骤,空行就会被Clang-Format校正为正常状态。
解决方法
选择以下任意一种方案配置,即可实现一次格式化得到正确结果:
- 方案1(推荐,无版本要求):关闭clangd自带的独立include排序功能,将include排序逻辑完全交给Clang-Format处理,从根源避免两次逻辑叠加
- 在VSCode的
settings.json中添加如下配置:
"clangd.sortIncludes": false- 确认项目下的
.clang-format配置文件中已开启Clang-Format原生的include排序(该选项默认开启,未手动关闭则无需额外修改):
SortIncludes: true- 按
Ctrl+Shift+P调出命令面板,执行Clangd: Restart language server重启clangd服务即可生效。
- 在VSCode的
- 方案2:升级本地clangd版本到15.0及以上
该执行顺序冲突是clangd 14及更早版本的已知bug,15.0版本后官方已经修复了预处理阶段的空行计数问题,升级后无需修改额外配置即可正常格式化。
注意:不要同时开启clangd的
sortIncludes和Clang-Format的SortIncludes,双重排序逻辑除了触发空行问题,还可能在部分复杂include场景下出现排序规则不一致的问题。
内容的提问来源于stack exchange,提问作者ride_pig
相关产品推荐
相关产品推荐

