假设我有两个类,它们具有来自两个不同库的相同成员:
namespace A {
struct Point3D {
float x,y,z;
};
}
namespace B {
struct Point3D {
float x,y,z;
};
}
当我尝试交叉播放时,它可以工作:
A::Point3D pa = {3,4,5};
B::Point3D* pb = (B::Point3D*)&pa;
cout << pb->x << " " << pb->y << " " << pb->z << endl;
在什么情况下可以保证能正常工作?总是?请注意,编辑外部库以添加对齐方式或类似内容是非常不希望的。我在Ubuntu 8.10上使用g++ 4.3.2。
最佳答案
如果您使用的结构只是数据,而没有使用继承,我认为它应该一直有效。
只要它们是POD,就可以了。
http://en.wikipedia.org/wiki/Plain_old_data_structures
符合标准(1.8.5)
“除非是位域(9.6),否则派生最多的对象的大小应为非零,并且应占据一个或多个字节。
贮存。基类子对象的大小可能为零。 POD5的对象)
类型(3.9)应占用的连续字节
贮存。”
如果它们占用连续的存储字节,并且它们是具有不同名称的相同结构,则强制转换应该成功