C风格的铸造混乱
我正在阅读某人的(公共)源代码,并且我遇到了这一行,并且不知道它的功能。我尝试过分解它,但它总是最终令我困惑,尽管我尝试了。C风格的铸造混乱
uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice;
pd3dDevice
是LPDIRECT3DDEVICE9
,这是一个IDirect3DDevice9*
。 IDirect3DDevice9
是继承了IUnknown
的类,它们都实现了一堆虚函数。
有人可能更世俗请帮我这个代码做的,一行一行吗?
非常感谢您的时间!
uintptr_t的是可以存储一个整数类型指针。作者假设(知道?)IDirect3DDevice9中的第一个条目是一个指针,因此他将IDirect3DDevice9转换为(uintptr_t *)并将其取消引用以访问该指针。然后他再次将该uintptr_t转换为指向uintptr_t的指针以将其分配给pInterfaceVTable。
正如在评论和AndyT中所提到的那样,那就是所使用的编译器存储了指向VTable的指针,但这不是由C++保证的。
演员与“ (uintptr_t *)pd3dDevice'? –
@Kerrek:指针被解除引用,所以你没有得到pd3dDevice的值,但是pd3dDevice指向的值被解释为uintptr_t * – stefaanv
哦,当然,我明白了。仍然UB,但:-) –
uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice;
看起来,做了强制转换为uintptr_t的*然后取消引用指针,然后蒙上解除引用的结果为uintptr_t的*
这实际上是未定义的行为。写这个的正确方法是这样的:'uintptr_t * p; const char * q = reinterpert_cast(pd3dDevice); std :: copy(q,q + sizeof(uintptr_t *),reinterpret_cast (&p));'。 –