簡體   English   中英

了解將結構轉換為空指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM