2017-07-18 125 views
1

我正在嘗試在C中使用Direct2D編寫一個小型的小型遊戲引擎。我沒有使用Windows C編譯器;但是使用MinGW。與Direct2D不兼容的指針類型

然而任何使用C的聲明ID2D1HwndRenderTarget我得到這個錯誤:

graphics.c:45:37: warning: passing argument 1 of 'graphics->_target->lpVtbl->Base.BeginDraw' from incompatible pointer type [ 
-Wincompatible-pointer-types] 
    ID2D1HwndRenderTarget_BeginDraw(graphics->_target); 
            ^
graphics.c:45:37: note: expected 'ID2D1RenderTarget * {aka struct ID2D1RenderTarget *}' but argument is of type 'ID2D1HwndRen 
derTarget * {aka struct ID2D1HwndRenderTarget *}' 

我有一個graphics_t類型定義爲:

和功能graphics_begin_draw

void graphics_begin_draw(graphics_t *graphics) { 
    ID2D1HwndRenderTarget_BeginDraw(graphics->_target); 
} 

ID2D1HwndRenderTarget_BeginDraw是一個宏和f從我可以收集它似乎正確地找到成員BeginDraw分開graphics->_target->lpVtbl->Base.BeginDraw;然而Base.BeginDraw需要ID2D1RenderTarget *而不是ID2D1HwndRenderTarget *

從我的理解對ID2D1HwndRenderTarget繼承ID2D1RenderTarget所以我可以看到爲什麼Base.BeginDraw會想到ID2D1RenderTarget *;有沒有辦法避開這些警告?

我可以改爲創建一個具有投宏觀的一個新的定義,但我不相信,如果這是正確的解決辦法:

#define _ID2D1HwndRenderTarget_BeginDraw(this) (this)->lpVtbl->BeginDraw((ID2D1RenderTarget *)this) 

這是所有它可以是頭文件中定義發現here

+0

我有一個關於演員的口頭禪:「每次使用演員時,一隻小貓都會死」。投擲*通常意味着你做錯了事。如果你被允許將「ID2D1HwndRenderTarget」傳遞給「ID2D1RenderTarget」,編譯器會讓你。不要殺小貓:-) – Neil

+0

@尼爾你是對的;我的意思是演員試圖在不考慮宏觀實際工作方式的情況下天真地壓制警告。 – jacob

+2

C語言並不是編寫Direct2D代碼的最有效方式。接口和類型繼承的概念完全不存在,但是它是api工作方式的核心。編譯器不知道結構類型是相關的,因此警告。您將獲得更多的這些信息,請考慮禁用警告以實現目標。或者將代碼寫入C++編譯器支持的虛構但實用的「C with classes」子集中,有些可能會發現可以包裝接口指針的智能指針類型。 –

回答

0

我最終編寫了一個禁用警告的宏,以便我可以從建築物中刪除一些混亂。

#define IGNORE_INCOMPATIBLE_POINTER_TYPES(block) \ 
_Pragma("GCC diagnostic push") \ 
_Pragma("GCC diagnostic ignored \"-Wincompatible-pointer-types\"") \ 
block \ 
_Pragma("GCC diagnostic pop")