我正在研究Blender的鬼代码,并在GHOST_CreateSystem C-API函数中找到了以下语句
GHOST_ISystem::createSystem();
GHOST_ISystem *system = GHOST_ISystem::getSystem();
return (GHOST_SystemHandle)system;GHOST_ISystem是特定操作系统(如win32、linux )的抽象类。
GHOST_SystemHandle定义为结构类型如下:
typedef struct GHOST_SystemHandle__ {
int unused;
} * GHOST_SystemHandle我不熟悉这种类型--将指向类的指针转换为带有整数成员的struct类型指针。
希望能告诉我这件事的背景。
发布于 2022-04-14 07:16:40
抽象类不能被实例化,也就是说不能被转换。这里发生的是指针值的转换。
调用GHOST_ISystem::createSystem();和GHOST_ISystem::getSystem();是对静态函数的调用。后者返回指向GHOST_ISystem的指针。指针是一个单独的复合类型,指向任何声明类型的指针都可以物化。指向抽象类类型的指针可以保存指向任何派生类型的指针的值.GHOST_ISystem*是它的静态类型,而它的动态类型可以改变。
C样式的强制转换语法(GHOST_SystemHandle)system;在C++中被认为是错误的,因为它太允许不安全的转换。在这种情况下,它被视为指向指针reinterpret_cast的GHOST_SystemHandle__ *。
指针system的内容按字节顺序复制到GHOST_SystemHandle的一个实例中,该实例也是一个指针。这将取决于这样一种假设,即在实施中的所有指针都有相似的内容和相同的大小,取消引用结果的访问将是合法的。
很可能,其根本原因是派生类型将具有一个整数字段或具有相同对齐方式的子对象。严格地说,结果是不明确的。原始类和GHOST_SystemHandle__的内存模型应该匹配。这假设了太多的事情:
抽象基类类型没有非静态成员变量,或者它包含的等效成员variable.
GHOST_SystemHandle__的对齐要求相同。不是的,*system->unused的结果是未定义的。在C++中可以避免许多方法,但没有使用,这意味着代码是从C转换而来的,而不需要进行大量重构,同时为了兼容性而保持接口类型格式相同。
https://stackoverflow.com/questions/71867686
复制相似问题