首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将抽象类类型转换为具有整数成员的struct类型

将抽象类类型转换为具有整数成员的struct类型
EN

Stack Overflow用户
提问于 2022-04-14 07:06:49
回答 1查看 51关注 0票数 0

我正在研究Blender的鬼代码,并在GHOST_CreateSystem C-API函数中找到了以下语句

代码语言:javascript
复制
  GHOST_ISystem::createSystem();
  GHOST_ISystem *system = GHOST_ISystem::getSystem();

  return (GHOST_SystemHandle)system;

GHOST_ISystem是特定操作系统(如win32、linux )的抽象类。

GHOST_SystemHandle定义为结构类型如下:

代码语言:javascript
复制
typedef struct GHOST_SystemHandle__ {
      int unused; 
    } * GHOST_SystemHandle

我不熟悉这种类型--将指向类的指针转换为带有整数成员的struct类型指针。

希望能告诉我这件事的背景。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-14 07:16:40

抽象类不能被实例化,也就是说不能被转换。这里发生的是指针值的转换。

调用GHOST_ISystem::createSystem();GHOST_ISystem::getSystem();是对静态函数的调用。后者返回指向GHOST_ISystem的指针。指针是一个单独的复合类型,指向任何声明类型的指针都可以物化。指向抽象类类型的指针可以保存指向任何派生类型的指针的值.GHOST_ISystem*是它的静态类型,而它的动态类型可以改变。

C样式的强制转换语法(GHOST_SystemHandle)system;在C++中被认为是错误的,因为它太允许不安全的转换。在这种情况下,它被视为指向指针reinterpret_castGHOST_SystemHandle__ *

指针system的内容按字节顺序复制到GHOST_SystemHandle的一个实例中,该实例也是一个指针。这将取决于这样一种假设,即在实施中的所有指针都有相似的内容和相同的大小,取消引用结果的访问将是合法的。

很可能,其根本原因是派生类型将具有一个整数字段或具有相同对齐方式的子对象。严格地说,结果是不明确的。原始类和GHOST_SystemHandle__的内存模型应该匹配。这假设了太多的事情:

抽象基类类型没有非静态成员变量,或者它包含的等效成员variable.

  • The实现符合晚标准,以确保基类型子对象的大小为零,如果它不具有非静态成员variables.

  • The对齐要求,则派生类型的对齐要求与GHOST_SystemHandle__的对齐要求相同。不是的,*system->unused的结果是未定义的。

在C++中可以避免许多方法,但没有使用,这意味着代码是从C转换而来的,而不需要进行大量重构,同时为了兼容性而保持接口类型格式相同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71867686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档