C++ 理解将结构强制转换为空指针
我在Quake 3的渲染库中找到了这段代码。有以下功能:C++ 理解将结构强制转换为空指针,c++,c,C++,C,我在Quake 3的渲染库中找到了这段代码。有以下功能: void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int fogIndex, int dlightMap );` 它在循环中被调用,如下所示: R_AddDrawSurf( ( void * )poly, sh, poly->fogIndex, qfalse ); 奇怪的是poly被声明为srfPoly_t*poly。发生了什么事 在这里它将一个srfPo
void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int fogIndex, int dlightMap );`
它在循环中被调用,如下所示:
R_AddDrawSurf( ( void * )poly, sh, poly->fogIndex, qfalse );
奇怪的是poly被声明为srfPoly_t*poly。发生了什么事
在这里它将一个srfPoly_t对象强制转换为void*,然后输入
用作surfaceType\t对象
以下是相关结构的声明:
typedef enum {
SF_BAD,
SF_SKIP, // ignore
SF_FACE,
SF_GRID,
SF_TRIANGLES,
SF_POLY,
SF_MD3,
SF_MD4,
SF_FLARE,
SF_ENTITY, // beams, rails, lightning, etc that can be determined by entity
SF_DISPLAY_LIST,
SF_NUM_SURFACE_TYPES,
SF_MAX = 0x7fffffff // ensures that sizeof( surfaceType_t ) == sizeof( int )
} surfaceType_t;
typedef struct srfPoly_s {
surfaceType_t surfaceType;
qhandle_t hShader;
int fogIndex;
int numVerts;
polyVert_t *verts;
} srfPoly_t;
这是用C语言编写的,但是我尝试在C++中实现类似的东西, 但我得到了以下错误:
Error 1 error C2664: 'int RefDef::AddDrawSurf(surfaceType_t *)' : cannot convert argument 1 from 'void *' to 'surfaceType_t *'
我似乎不能在C++中执行这种类型的转换,或者可能存在 还有一些我无法理解的事情。我不太熟悉C++和 我很想知道如何使用它来设置类似的东西
我假设这与C++中的类型检查有关,所以不是
允许。如何在C++中实现类似的安全方法? ,这在C中工作,因为结构只是内存的块,结构中的每个元素都是连续排列的。此强制转换之所以有效,是因为srfPoly_t结构的前n个字节由该结构中的surfaceType_t枚举组成。被调用函数尝试将传入的srfPoly_t解释为surfaceType_t,并成功,因为参数的前n个字节实际上是surfaceType_t。没有很好的理由不要这样做 <虚空*的强制转换不会在C++中自动发生,因为C中可以使用ReCuffTyCube显式地在两种不同类型的结构之间进行转换:
srfPoly_t* mySrfPoly_t;
surfaceType_t* mySurfaceType = reinterpret_cast<surfaceType_t*>(mySrfPoly_t);
这在C中起作用,因为结构只是内存块,结构中的每个元素都是连续排列的。此强制转换之所以有效,是因为srfPoly_t结构的前n个字节由该结构中的surfaceType_t枚举组成。被调用函数尝试将传入的srfPoly_t解释为surfaceType_t,并成功,因为参数的前n个字节实际上是surfaceType_t。没有很好的理由不要这样做 <虚空*的强制转换不会在C++中自动发生,因为C中可以使用ReCuffTyCube显式地在两种不同类型的结构之间进行转换:
srfPoly_t* mySrfPoly_t;
surfaceType_t* mySurfaceType = reinterpret_cast<surfaceType_t*>(mySrfPoly_t);
基本上,这是一种秘密的方式来做R_AddDrawSurf&poly->surfaceType。。。。我看不出有什么好的理由。结构的地址也是其第一个成员的地址,因此星号对齐。至于为什么它在C中工作,而不是C++:在C中,空洞*可以隐式地转换为任何指针类型,而C++中则不能。它不是在构造一个结构来空洞*。它将一个结构指针投射到void*。基本上,这是一种秘密的方式来执行R_AddDrawSurf&poly->surfaceType。。。。我看不出有什么好的理由。结构的地址也是其第一个成员的地址,因此星号对齐。至于为什么它在C中工作,而不是C++:在C中,空洞*可以隐式地转换为任何指针类型,而C++中则不能。它不是在构造一个结构来空洞*。它将结构指针强制转换为void*。请注意,这里您正在mySrfPoly_t.surfaceType中创建数据的副本,而OP位于指向原始指针的指针之后。哎呀,我忘了从指针转换为指针。谢谢你的提示-我已经编辑了我的答案来反映这一点。请注意,在这里,你正在mySrfPoly_t.surfaceType中创建数据的副本,而OP是在指向原始指针的指针之后。哎呀,我忘了从一个指针转换到另一个指针。谢谢你的关注-我编辑了我的答案来反映这一点。