2017-07-18 107 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")