确保每个标头在大型项目中使用唯一的包含保护

Make sure every header uses unique include guards in big project

本文关键字:唯一 保护 包含 大型项目 确保      更新时间:2023-10-16

在一个不太小的项目(>100.h)中,我想确保每个.h使用不同的包含保护(#ifndef XXX)。

每当我违反它时,我都希望尽快得到通知。

情况

以下是我使用的约定(半自动生成,VS2015):-

Foo.h

#ifndef Foo_h__
#define Foo_h__
//....... some long code .........
#endif //Foo_h__

有时(每1-4周一次),在我创建新文件、复制和粘贴源代码或广泛重构(重命名)后,我会在include保护方面犯一些错误。结果:-

  • Include guard与文件名不再匹配
  • Include保护恰好与另一个标头中的另一个包含保护相同

问题

如何预防和治疗包含保护的重复?

我糟糕的解决方案

解决方案1:-

#pragma once

缺点:它是特定于编译器的。我不希望我的代码依赖于编译器。

解决方案2:-

(已编辑,感谢Benjamin LindleyBeta。)

我可以编写一个自动代码生成脚本。这是一个可能的标准:-

<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED

缺点:它需要一个外部脚本。

由于#pragma once不是完全可移植的,我的建议是在构建过程之前运行这个简单的bash脚本:

find . -name '*.h' -o -name '*.hpp' | xargs -n1 -d 'n' grep "#ifndef .*_H.*" | sort | uniq -cd

它最终显示了有多少文件使用相同的include保护,以及错误重复的确切include保护。