在构建我的小型C ++项目时,我得到以下2个错误,无法找出原因:
错误:在'struct'之后使用typedef-name'TTF_Font'
指向以下代码行:Foo.h中的struct TTF_Font;
。
错误:'TTF_Font'此前有声明。
指向以下代码行:SDL_ttf.h中的typedef struct _TTF_Font TTF_Font;
。
我已将其缩小到新测试项目中的以下文件:
foo.h中:
#ifndef FOO_H
#define FOO_H
struct TTF_Font;
class Foo
{
TTF_Font* font;
};
#endif // FOO_H
Foo.cpp中:
#include "Foo.h"
#include "SDL/SDL_ttf.h"
// No implementation, just testing
Main.cpp的:
#include "Foo.h"
int main(int argc, const char* argv[])
{
Foo a;
return 0;
}
你们知道我做错了吗?
我的目标是转发声明TTF_Font,因此我可以在我的头文件中使用它而不包括SDL_ttf头文件。我读到包含其他头文件中的头文件是一种不好的做法,所以我切换到转发声明。我的所有其他前向声明都可以正常工作,除了这个单一的结构。
当我使用标题include struct TTF_Font;
替换前向声明#include "SDL/SDL.ttf.h"
时,它会编译而不会出错。所以我可以使用它,但我想知道为什么,该死的: - )。
额外信息:我正在使用Code :: Blocks IDE和mingw32编译器。 Project使用SDL图形库。还没有太多的C ++经验,来自C#background。
答案 0 :(得分:8)
您正在尝试将某些内容声明为与实际内容不同的类型。
你宣布:
struct TTF_Font;
当错误消息指示TTF_Font
实际上是typedef
时,而不是struct
:
typedef struct _TTF_Font TTF_Font;
stuct实际上称为_TTF_Font
。
您可以多次声明相同的typedef
,这样您就可以使用typedef
声明代替前向声明来声明struct
并引入typedef
尽管它感觉有点像你正在使用你试图推迟的标题的实现细节,包括。
答案 1 :(得分:2)
问题在于此代码段:
struct foo_t;
typedef struct foo { ... } foo_t;
第一行是不同结构的前向声明,其名称与typedef
冲突。在这种情况下,前向声明需要struct foo;
,因为struct
本身的名称是foo
。