我有一个静态库 A ,提供的头文件中有 public 的结构体和方法接口,以供别人调用
namespace api {
struct MyStruct {
std::string text;
int text_length;
};
std::string getStructInfo(const MyStruct &struct);
}
另一个静态库 B ,依赖了静态库 A ,其源码内实例化了一个 MyStruct
结构体对象,并调用了 getStructSize
方法获取了结果
静态库 A 和静态库 B 均以 二进制.a
形式集成到工程 App 中使用
某一天,静态库 A 中的头文件 MyStruct 定义发生变化:
struct MyStruct {
int text_length;
float score;
std::string full_text;
};
我想在不重新构建静态库 B ,保持 MyStruct 命名不变,使用新定义
的情况下,通过指针偏移或二进制适配手段,使静态库 B 内的代码逻辑能正常运行,应该如何进行处理?
我的想法是,由于 getStructSize
的参数是引用,所以打算通过上测算出老的结构体定义的大小,然后 memcpy
对应长度的 buffer 到一个和原结构体定义完全一致,但命名空间不一致的的结构体中,随后进行提取:
第一步:定义一个结构体,和原来的 MyStruct 完全一致,但通过命名空间隔离:
namespace old {
struct MyStruct {
std::string text;
int text_length;
};
}
第二步:在 getStructInfo 内部,进行转换
int getStructInfo(const MyStruct &struct) {
size_t old_size = sizeof(old::MyStruct);
old::MyStruct old_struct;
memcpy(&old_struct, &struct, old_size);
printf("old struct text:%s", old_struct.text.c_str());
……
}
总觉得这个方法是可以的,但实际操作的过程中就不行,无法获得 text 的值,这是为什么呢?求大神赐教下
补充信息:iOS 系统,arm64 架构
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.