我试图用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/

10-11 15:11