考虑这个 include 语句。 注意
iostream
之后的额外空格:
#include <iostream >
msvc 会编译它,但 gcc 不会。 因此,在使用 gcc 构建我们的 CI 进程之前,我们的 Windows 开发人员可能不会看到此故障。
有没有办法获得 clang-format 来删除 include 语句尖括号内的多余空格?
我已经查看了与包含和空格相关的文档,但找不到任何删除空格的内容。
SpacesInAngles
- 这可以控制模板等内容的尖括号中的空格,但不会更改包含内容。 (我们在大多数代码中更喜欢角度中的空格)。
您绝对不能使用与编译器无关的格式化工具来执行此操作,因为尖括号内的确切内容可能很重要。该标准规定,根据尖括号内的确切字符串搜索确切的文件是实现定义的,当您查看例如GCC预处理器文档(第2.6节),你发现连空格都用了。
在 Linux 上,我可以
touch "myheader.h "
并使用 G++ 14 和 -I $(pwd)
编译以下内容:
#include <myheader.h >
int main() {}
注意文件名中的尾随空格(是的,这是可能的!)并包含指令。删除其中任何一个都会导致编译错误。
该怎么办?
我在这里假设您希望在所有情况下检测并删除这些空格,而不仅仅是在稍后会导致编译错误时。否则,你可以采取偷懒的方式,忽略它并处理出现的编译错误 - 修复起来并不是特别困难,如果这是一个足够常见的错误值得关注,开发人员将学会避免它。
创建一个自定义的预提交挂钩(或 CI 作业等)来查找此模式。一对简单的扩展正则表达式(如
^#include <\s+(.*)>$
和 ^#include <(.*)\s+>$
)应该涵盖 99% 的情况 - 包括块注释和 ifdef。然后您可以提出警告或错误并建议修复。
当然,这将使您的代码库无法包含任何带有前导或尾随空格的内容,这就是代码格式化程序不提供此选项的原因。