【发布时间】:2017-07-11 09:11:32
【问题描述】:
我有一个其他人在某处使用的结构,他们也依赖sizeof(struct S)。下面是我的结构,
struct S{
int aVar1;
void *ptr1;
}
将来,我可能会向它添加新成员(现在不确定),例如..
struct S{
int aVar1;
void *ptr1;
int aVar2;
void *ptr2;
}
我知道这破坏了与依赖 sizeof 的用户的向后兼容性。
为了避免这种情况,我计划添加一些指向 struct 的虚拟指针,以便将来使用。
struct S{
int aVar1;
void *ptr1;
void *dummyptr1;
void *dummyptr2;
void *dummyptr3;
void *dummyptr4;
void *dummyptr5;
void *dummyptr6;
}
请有更好的解决方案来保持向后兼容性?
【问题讨论】:
-
更好的解决方案是不要期望结构的大小在实际发生变化时永远不会改变
-
客户认为他们从
sizeof(struct S)获得了哪些信息? -
您希望在何种意义上保持兼容性?你能举一个兼容性变得重要的例子吗?您应该知道,根据标准严格来说,
S的上述定义都不兼容(因此您必须考虑工具链/平台的细节)。 -
他们为什么要依赖 sizeof 结构?实际上依赖ABI没有改变吗?他们没有重新编译(你正在编写一个库)吗?你在传递信息吗?工厂可以工作吗?使用版本号序列化/反序列化?这取决于...
-
粉刺可行吗?将新成员隐藏在不透明指针后面,类似于 [Qt's d-pointer](wiki.qt.io/D-Pointer)
标签: c++ c backwards-compatibility