如何禁止其他开发人员在c++中包含第三方头文件
how to prohibit other developers to #include a third party header in C++
所以有一个第三方库,你需要包含一个头文件才能使用它。由于库的实现不是面向对象的,所以我编写了一个类来封装库的所有使用,因此如果需要替换它,我可以修改该类的实现。
由于其他开发人员将在相同的代码库中工作,我想要一种方法,如果他们包含库,给他们一个错误。这是为了避免到处都有对库的引用。
例如,如果他们这样做:
#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,继续搜索路径,如果你包含的东西命名与正在读取的头完全相同的东西)
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 无法在UE4中包含BP类到CPP类
- g++ 说函数不存在,即使包含正确的标头
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- Visual C++GC接口如何启用它以及要包含哪个库
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)