[英]Passing pointer to struct, vs. passing void pointer and casting to struct
[英]Understanding casting a struct as a void pointer
我在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 ++中實現類似的功能?
這在C語言中有效,因為結構只是內存塊,結構中的每個元素都連續排列。 該投工作,因為第一n
一個字節srfPoly_t
結構組成的的surfaceType_t
該結構中枚舉。 被調用的函數試圖解釋傳入的srfPoly_t
作為surfaceType_t
,並成功,因為第一n
的說法字節,事實上,一個surfaceType_t
。 沒有充分的理由就不要這樣做。
從void*
的強制轉換不會像在C中那樣自動在C ++中進行。您可以使用reinterpret_cast
在兩種不同類型的結構之間顯式進行強制轉換:
srfPoly_t* mySrfPoly_t;
surfaceType_t* mySurfaceType = reinterpret_cast<surfaceType_t*>(mySrfPoly_t);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.