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.BeginDraw
はID2D1RenderTarget *
で、ID2D1HwndRenderTarget *
ではありません。
私はBase.BeginDraw
がID2D1RenderTarget *
を期待し、なぜ私が見ることができるID2D1HwndRenderTarget
それ継承ID2D1RenderTarget
からについて理解するものから、これらの警告を回避する方法はありますか?これは、すべてのことができるヘッダ・ファイルに定義されて
#define _ID2D1HwndRenderTarget_BeginDraw(this) (this)->lpVtbl->BeginDraw((ID2D1RenderTarget *)this)
:これは右の修正であれば
私の代わりにキャストを行うマクロの新しい定義を作成することもできますが、私は確信していませんよ見つけたhere。
「キャストを使用するたびに、子猫が死ぬ」というキャストに関するマントラがあります。キャスティング*は、あなたが何か間違っていることを意味します。 '' ID2D1HwndRenderTarget''を '' ID2D1RenderTarget''に渡すことが許されていれば、コンパイラはあなたにあなたを任せます。子猫を殺さないでください:-) – Neil
@Neilあなたは正しいです。私は、マクロが実際にどのように機能しているかを考えずに警告を非表示にする試みとしてキャストを意味しました。 – jacob
C言語は、Direct2Dコードを書くのに最も生産的な方法ではありません。インタフェースと型継承の概念は完全に欠けていますが、apiの動作方法の中核です。コンパイラは、構造体の型が関連していることを何も知らないので、警告になります。あなたはそれらの多くを得るつもりです、先に進むために警告を無効にすることを検討してください。 C++コンパイラがサポートしている架空の実用的な "クラス付きC"サブセットにコードを書くと、インタフェースポインタを有効にすることができるスマートポインタ型を見つけることができます。 –