如何禁止其他开发人员在c++中包含第三方头文件

how to prohibit other developers to #include a third party header in C++

本文关键字:c++ 包含 第三方 文件 何禁止 禁止 开发 其他      更新时间:2023-10-16

所以有一个第三方库,你需要包含一个头文件才能使用它。由于库的实现不是面向对象的,所以我编写了一个类来封装库的所有使用,因此如果需要替换它,我可以修改该类的实现。

由于其他开发人员将在相同的代码库中工作,我想要一种方法,如果他们包含库,给他们一个错误。这是为了避免到处都有对库的引用。

例如,如果他们这样做:

#include "cool_library.h"

他们会得到一个错误:

do not include directly cool_library.h, instead use the cool_library_wrapper class

这可能吗?我使用GNU GCC

既然您使用的是gcc,那么您可以使用预处理器的#include_next特性:在查找头文件时具有更高优先级的目录中创建与第三方相同名称的头文件。在你的标题版本中使用类似

的内容
#if WRAPPER_HEADER_HAS_BEEN_INCLUDED
#  include_next <cool_library.h>
#else
#  error ...
#endif

可以在#ifndef块中使用#error预处理器指令。

例如,在原始的。h文件中有这样的内容:

#ifndef COOL_LIBRARY_WRAPPER_CLASS_INCLUDED
#error "do not include this file directly
#endif

在包装器类的头文件中这样做:

#define COOL_LIBRARY_WRAPPER_CLASS_INCLUDED

这只有在你可以修改cool_library.h文件的情况下才有可能。你可以这样做:

cool_library.h

#ifndef INCLUDED_FROM_COOL_LIBRARY_WRAPPER
#error do not include directly cool_library.h, instead use the cool_library_wrapper class
#endif
.. remainder of original cool_library.h

cool_library_wrapper.h

#define INCLUDED_FROM_COOL_LIBRARY_WRAPPER
#include "cool_library.h"
... your wrapper
#undef INCLUDED_FROM_COOL_LIBRARY_WRAPPER

当然,您仍然不能阻止您的同事自己定义INCLUDED_FROM_COOL_LIBRARY_WRAPPER并包括原始头文件。这是一个没有技术解决方案的社会问题。

如果你经常包含一些项目范围的头文件,你可以从第三方头文件中检查包含保护的存在,例如

// third_party.h
#ifndef THIRD_PARTY_H
#define THIRD_PARTY_H
...

// your_project_wide.h
...
#ifdef THIRD_PARTY_H
#warning "Please include "cool_library.h"
#endif
...

注意事项:#warning是一个gcc扩展,所有这些都依赖于在项目头文件之前包含的外部依赖项(您可能不想这样做)。

不要将<cool_library.h>放在正常的构建包含路径中。您可以使用特殊的CFLAGS为包装器提供访问权限,也可以使用更显式的路径(如<vendor/xyz/cool_library.h>)从一些更高级的包含路径访问它。

另一种基于路径的方法是将本地<cool_library.h>放在包含路径的前面,并使用上面的#ifdef/#error方法。如果魔术定义存在,那么存根报头可以使用更显式的路径来获取真正的报头。(一些编译器有一个hack,继续搜索路径,如果你包含的东西命名与正在读取的头完全相同的东西)