2017-07-18 28 views
1

Direct2Dを使用してCで小さなゲームエンジンを作成しようとしています。私はWindows Cコンパイラを使用していません。代わりにMinGWを使用します。私はgraphics_tタイプのように定義されているDirect2Dで互換性のないポインタ型

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_begin_draw

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

は、しかし、任意のCの宣言を使用してID2D1HwndRenderTargetため、私はこのエラーを取得します

ID2D1HwndRenderTarget_BeginDrawはマクロであり、f私が集めることができるものは、正確にメンバーBeginDrawを見つけているようです。graphics->_target->lpVtbl->Base.BeginDrawの部分です。 Base.BeginDrawID2D1RenderTarget *で、ID2D1HwndRenderTarget *ではありません。

私はBase.BeginDrawID2D1RenderTarget *を期待し、なぜ私が見ることができるID2D1HwndRenderTargetそれ継承ID2D1RenderTargetからについて理解するものから、これらの警告を回避する方法はありますか?これは、すべてのことができるヘッダ・ファイルに定義されて

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

:これは右の修正であれば

私の代わりにキャストを行うマクロの新しい定義を作成することもできますが、私は確信していませんよ見つけたhere

+0

「キャストを使用するたびに、子猫が死ぬ」というキャストに関するマントラがあります。キャスティング*は、あなたが何か間違っていることを意味します。 '' ID2D1HwndRenderTarget''を '' ID2D1RenderTarget''に渡すことが許されていれば、コンパイラはあなたにあなたを任せます。子猫を殺さないでください:-) – Neil

+0

@Neilあなたは正しいです。私は、マクロが実際にどのように機能しているかを考えずに警告を非表示にする試みとしてキャストを意味しました。 – jacob

+2

C言語は、Direct2Dコードを書くのに最も生産的な方法ではありません。インタフェースと型継承の概念は完全に欠けていますが、apiの動作方法の中核です。コンパイラは、構造体の型が関連していることを何も知らないので、警告になります。あなたはそれらの多くを得るつもりです、先に進むために警告を無効にすることを検討してください。 C++コンパイラがサポートしている架空の実用的な "クラス付きC"サブセットにコードを書くと、インタフェースポインタを有効にすることができるスマートポインタ型を見つけることができます。 –

答えて

0

警告を無効にするマクロを作成したので、ビルドの混乱を取り除くことができます。

#define IGNORE_INCOMPATIBLE_POINTER_TYPES(block) \ 
_Pragma("GCC diagnostic push") \ 
_Pragma("GCC diagnostic ignored \"-Wincompatible-pointer-types\"") \ 
block \ 
_Pragma("GCC diagnostic pop") 
関連する問題