struct base { int x; int y;};struct derived { struct base super; int z;};struct derived d;d.super.x = 1;d.super.y = 2;d.z = 3;struct base b = (struct base *)&d;
这很好,但是对于深度继承树来说变得很麻烦 – 我会有大约5-6个“类”的链,我真的不会一直输入derived.super.super.super.super.super.super .我希望是我可以对前n个元素的结构进行类型转换,如下所示:
struct base { int x; int y;};struct derived { int x; int y; int z;};struct derived d;d.x = 1;d.y = 2;d.z = 3;struct base b = (struct base *)&d;
我已经在Visual Studio 2012附带的C编译器上进行了测试,但是它可以工作,但我不知道C标准是否真的能够保证它.是否有人可能确定这是否可以?我不想写大量的代码只是为了发现它在如此基础的层面上被打破了.
解决方法 你在这里描述的是一个完全可移植的结构,基本上可以保证通过语言的设计工作,除了标准的作者认为没有必要明确要求编译器支持显然应该工作. C89为联合指定了公共初始序列规则,而不是指向结构的指针,因为给定:struct s1 {int x; int y; ... other stuff... };struct s2 {int x; int y; ... other stuff... };union u { struct s1 v1; struct s2 v2; };
接收结构s1 *到外部对象的代码
一个联合u *或malloc’ed对象可以合法地将它转换为一个联盟u *
如果它与那种类型对齐,它可以合法地投射结果
指向struct s2 *的指针,并且使用访问struct s1 *或struct s2 *的效果必须与通过v1或v2成员访问union相同.因此,编译器使所有指示规则工作的唯一方法是将一个结构类型的指针转换为另一个类型的指针并使用该指针检查公共初始序列的成员将起作用.
遗憾的是,编译器编写者已经说CIS规则仅适用于底层对象具有union类型的情况,尽管事实上这样的事情代表了一种非常罕见的用例(与存在联合类型的情况相比)让编译器知道结构的指针应该可以互换处理以便检查CIS),并且因为代码很少接收到一个struct s1 *或struct s2 *来标识一个union u中的对象,所以认为他们应该被允许忽视这种可能性.因此,即使上面的声明是可见的,gcc也会假设struct s1 *永远不会用于从struct s2 *访问CIS的成员.
总结以上是内存溢出为你收集整理的C继承通过类型惩罚,没有包含?全部内容,希望文章能够帮你解决C继承通过类型惩罚,没有包含?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)