带有嵌套includes的c++库
c++ Library with nested includes
所以我正在尝试用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.h
和glfw3.h
调用函数
唯一的选择是确保库标头不包含标头,而是包含在源中。
IE:
库标题:
int test();
图书馆资料来源:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "sample.h"
int test() { return 20; }
项目的源文件保持不变。
这要求glew.h
和glfw3.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。库的公共接口不需要更改以支持两个后端。
如果您想了解更多关于这种方法的信息,请尝试搜索"不透明数据类型"
相关文章:
- 在 c++ 中是否有像 javascript 中那样"includes()"的方法
- 当 ESP32 在 Newlib/ 而不是 ESP32/ 中找到组件 #includes esp_types.h 时,E
- CMake 看不到源文件,找不到 #includes
- 我可以只从带有 Ctags 的C++文件中获取 #includes 吗?
- 关于循环依赖 #includes C++
- 编译器是否C++优化未使用的 #includes
- 在代码(头文件和实现文件)中放置#includes和Redundancies的位置
- 展开 #includes 到文本文件以进行C++
- VS2010 未正确处理预处理器条件下的"includes"
- No GTK includes
- 如何在编译DLL时添加includes
- c++ fails to find includes
- 为什么不为类使用cpp文件includes
- 将所有常用的全局变量移到一个头文件中,以减少#includes的数量,这是一种好的做法吗
- 你能把 #includes 放在C++标题中吗?
- C++ #includes和类型变量的设计问题
- 在另一个系统上构建时禁用特定的C++行和 #includes
- Understanding #includes c++
- 使用 Clang 的 libtool 匹配 #includes(或 #defines)的正确方法是什么?
- How do includes在C++中工作