gpt4 book ai didi

c - 与 Direct2D 不兼容的指针类型

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:31 25 4
gpt4 key购买 nike

我正在尝试使用 Direct2D 用 C 编写一个小型游戏引擎。我没有使用 Windows C 编译器;而是使用 MinGW。

然而,任何使用 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 类型定义为:

typedef struct graphics {
ID2D1Factory *_factory;
ID2D1HwndRenderTarget *_target;
} graphics_t;

和函数graphics_begin_draw:

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

ID2D1HwndRenderTarget_BeginDraw 是一个宏,据我所知,它似乎正确地找到了成员 BeginDrawgraphics->_target->lpVtbl- 的一部分>Base.BeginDraw;但是 Base.BeginDraw 采用 ID2D1RenderTarget * 而不是 ID2D1HwndRenderTarget *

根据我对 ID2D1HwndRenderTarget 的理解,它继承ID2D1RenderTarget 所以我可以理解为什么 Base.BeginDraw 期望一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com