在FlatBuffers中使用native_type时如何避免头文件循环依赖?
问题解决方案
这个场景不存在无法解决的循环依赖,你只需要通过前置声明拆分头文件依赖即可,具体操作如下:
- 拆分自定义类型的头文件
将vector2的类型定义单独放到独立头文件(例如vector2.h),该文件不要引入任何FlatBuffers相关代码或者生成的头文件。 - 新增适配层头文件
单独创建用于FlatBuffers适配的头文件(例如vector2_fbs_adapter.h),在该文件内先引入自定义类型,再前置声明FlatBuffers生成的Vec2类型,最后声明Pack/UnPack函数,示例代码如下:#include "vector2.h" // 前置声明FlatBuffers生成的类型,不需要完整定义 struct Vec2; namespace flatbuffers { Vec2 Pack(const vector2& obj); vector2 UnPack(const Vec2& obj); } - 配置schema的native_include
在FlatBuffers的schema文件中,将native_include的路径设置为上面的适配层头文件路径即可。 - 实现适配函数
在对应的cpp实现文件中,同时引入FlatBuffers生成的头文件和适配层头文件,编写Pack/UnPack的具体逻辑即可。
原理解释
C++语法允许函数声明时仅使用类型的前置声明,不需要知道类型的完整结构。生成的FlatBuffers头文件会先引入native_include指定的头文件,此时适配层头里的Vec2前置声明合法,后续生成头再完成Vec2的完整定义,整个编译流程不存在冲突,也不会出现循环依赖。
内容的提问来源于stack exchange,提问作者Lake
相关产品推荐
相关产品推荐

