Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解将结构强制转换为空指针_C++_C - Fatal编程技术网

C++ 理解将结构强制转换为空指针

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

我在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。发生了什么事 在这里它将一个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是在指向原始指针的指针之后。哎呀,我忘了从一个指针转换到另一个指针。谢谢你的关注-我编辑了我的答案来反映这一点。