【问题标题】:SDL_Texture - Incomplete typeSDL_Texture - 不完整类型
【发布时间】:2013-09-19 14:11:29
【问题描述】:

一天前我安装了一个 SDL2 库。它还没有在 Debian Wheezy 中,所以我使用了configure, make, make install 命令。

毕竟,当我尝试使用 SDL_Texture 时,我得到了这个错误:

error: forward declaration of ‘SDL_Texture {aka struct SDL_Texture}’
invalid use of incomplete type ‘SDL_Texture {aka struct SDL_Texture}’

查找声明后,我发现的都是SDL_render.h中的这两行:

struct SDL_Texture;
typedef struct SDL_Texture SDL_Texture; 

根本没有定义。我认为我的安装缺少文件 SDL_sysrender.h。它在我下载的源代码中,但不在 SDL2 包含路径中。

问题应该出在哪里?有必要对配置文件使用任何标志吗? 谢谢你的帮助。

【问题讨论】:

  • 你包括哪些标题?听起来其中一个 SDL 类标头具有前向声明,但该类的实际类标头未包含在某处,因此,您的类定义不完整。我不知道如果你调用一个找不到的头文件会发生什么,我猜你会得到一个链接器错误而不是这个错误。
  • 我目前只包含 SDL_render.h。我会尝试使用 SDL.h 看看会发生什么
  • 即使使用 SDL.h,问题仍然存在。

标签: c++ linux debian sdl-2


【解决方案1】:

您的安装没有问题。 SDL_Texture 在设计上是一种不透明类型(即设计为仅由 SDL2 内部操作),您可以将其作为指针“传递”,但您不能访问内部(或自己创建 SDL_Texture,例如通过做一个malloc,因为你不知道结构的大小)。如果你坚持

SDL_Texture *blah;

指针并将它们传递给 SDL2 函数应该没问题。

SDL_sysrender.h 是一个内部头文件,正如您所提到的,它实际上定义了 SDL_Texture 以供库的内部使用。

【讨论】:

  • 啊,我的错。如何编辑纹理或访问其属性?例如,在创建现有纹理的副本时?
  • 我知道这个,但它没有提供“渲染器”信息。我无法使用相同的渲染器创建给定纹理的副本...
  • 我的意思是深拷贝(不仅仅是复制指针,而是创建另一个具有相同参数的纹理)
  • 是的,这是 SDL2 API 中的一个缺口。在 SDL_Texture 上操作时请求渲染器实际上是多余的,因为纹理在内部知道它属于哪个渲染器(实际上有内部检查来验证您没有混淆它们)。您可以在外部跟踪渲染器(大多数应用只使用一个渲染器),或者使用 SDL 填写错误,要求修改并说明您面临的问题。
  • 无论如何,这对我来说似乎总是一个奇怪的设计选择,至少与 SDL_GLContext (AKA void*) 之类的东西相比。毕竟,你不能取消引用SDL_Window*SDL_Texture* 等——可见指针引导我尝试使用shared_ptr/unique_ptr/等。删除原始指针并强制执行正确的内存管理(并导致一些非常混乱的错误。)在不了解更多关于实现隐藏或 SDL 本身的情况下,这对我来说似乎是一种误导。还有其他选择吗?为什么他们不能/不会公开定义的结构来包含/隐藏这些仅 decl 的结构?
猜你喜欢
  • 2011-07-13
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多