2

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

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

例如,如果他们这样做:

#include "cool_library.h"

他们收到一条错误消息:

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

这可能吗?我正在使用 GNU GCC

4

5 回答 5

4

由于您使用的是gcc,因此您可以使用#include_next预处理器的功能:在查找头文件时具有更高优先级的目录中创建与第 3 方同名的头文件。在您的标头版本中,使用类似

#if WRAPPER_HEADER_HAS_BEEN_INCLUDED
#  include_next <cool_library.h>
#else
#  error ...
#endif
于 2011-10-13T01:54:02.727 回答
3

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

例如在原始的 .h 文件中有这个:

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

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

#define COOL_LIBRARY_WRAPPER_CLASS_INCLUDED
于 2011-10-12T23:08:53.310 回答
2

这只有在您可以修改cool_library.h文件的情况下才有可能。您可以执行以下操作:

酷库.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自己并包含原始头文件。这是一个没有技术解决方案的社会问题。

于 2011-10-12T23:10:34.213 回答
1

不要放入<cool_library.h>正常的构建包含路径。您可以使用 specialCFLAGS为您的包装器授予访问权限,也可以使用更明确的路径访问它,例如<vendor/xyz/cool_library.h>从某些更高级别的包含路径。

另一种基于路径的方法是<cool_library.h>在包含路径的前面放置一个本地并使用#ifdef/#error上面的方法。如果存在魔术定义,则存根标头可以使用更明确的路径来获取真正的标头。(如果您包含与正在读取的标头完全相同的内容,则某些编译器会继续搜索路径)

于 2011-10-12T23:48:32.603 回答
1

如果您通常包含一些项目范围的标头,则可以检查第三方标头中是否存在包含保护,例如

// 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 扩展,所有这些都依赖于在项目标头之前包含的外部依赖项(您可能不想这样做)。

于 2011-10-12T23:10:15.647 回答