带有嵌套includes的c++库

c++ Library with nested includes

本文关键字:c++ includes 嵌套      更新时间:2023-10-16

所以我正在尝试用C++创建自己的库,并在另一个项目中使用它。到目前为止,它只适用于示例代码,但我必须在自己的库中包含其他库。所以问题是,当我把头文件从库中包括进来时,头文件中的include路径是混乱的。一个简单的解决方案是添加搜索目录,但我不认为,应该这样解决。

示例代码-库头文件:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
int test();

源文件:

#include "sample.h"
int test() { return 20; }

现在我想包括样本的项目

#include <sample.h>
int main() { int a = test(); }

问题是,include将sample.h中的代码直接复制到main.cpp中,而sample.h中其他include的搜索目录不再定义

一个简单的解决方案是添加搜索目录,但我不认为应该这样解决。

这当然是最简单的解决方案,因为它不需要对代码进行修改,而且通常是可以接受的做法——但很明显,这意味着项目可以从glew.hglfw3.h 调用函数


唯一的选择是确保库标头不包含标头,而是包含在源中。

IE:

库标题:

int test();

图书馆资料来源:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "sample.h"
int test() { return 20; }

项目的源文件保持不变。

这要求glew.hglfw3.h中定义的类型不是库公开的公共接口的一部分。

例如,如果你的图书馆有一个类似的功能

GLFWwindow* window = openWindow(...);

您需要将其更改为:

库头:

struct WindowHandle;
WindowHandle* openWindow(...);

图书馆来源:

struct WindowHandle{
    GLFWwindow* window;
};
WindowHandle* openWindow(...){
    WindowHandle* result;
    //... do stuff...
    result->window = //whatever;
    return result;
}

这种方法需要更改库代码,但其优点是库的用户不能直接调用库所依赖的东西(在这种情况下是glew和glfw)。如果你想支持多个平台,这是特别有益的,你可以有一个通过glfw打开窗口的源文件,另一个使用direct x。库的公共接口不需要更改以支持两个后端。

如果您想了解更多关于这种方法的信息,请尝试搜索"不透明数据类型"