我试图用Direct2D在C中编写一个小型的游戏引擎,我没有使用Windows C编译器,而是使用MinGW。
但是,如果对ID2D1HwndRenderTarget
使用C声明,则会出现以下错误:
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
类型定义为:typedef struct graphics {
ID2D1Factory *_factory;
ID2D1HwndRenderTarget *_target;
} graphics_t;
以及函数:
void graphics_begin_draw(graphics_t *graphics) {
ID2D1HwndRenderTarget_BeginDraw(graphics->_target);
}
graphics_begin_draw
是一个宏,据我所知,它似乎正确地找到了与ID2D1HwndRenderTarget_BeginDraw
分离的成员;但是BeginDraw
需要一个graphics->_target->lpVtbl->Base.BeginDraw
而不是一个Base.BeginDraw
。根据我对
ID2D1RenderTarget *
的理解,它继承自ID2D1HwndRenderTarget *
所以我可以理解为什么ID2D1HwndRenderTarget
会期望ID2D1RenderTarget
;有没有办法避开这些警告?相反,我可以为执行转换的宏创建一个新定义,但我不确定这是否是正确的解决方案:
#define _ID2D1HwndRenderTarget_BeginDraw(this) (this)->lpVtbl->BeginDraw((ID2D1RenderTarget *)this)
这都是在头文件中定义的,可以找到here。
最佳答案
最后我写了一个宏来禁用这个警告,这样我就可以从建筑物中清除一些杂乱的东西。
#define IGNORE_INCOMPATIBLE_POINTER_TYPES(block) \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wincompatible-pointer-types\"") \
block \
_Pragma("GCC diagnostic pop")
关于c - 与Direct2D不兼容的指针类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45159653/