向前声明一个结构时出错:“这里有一个先前的声明”

时间:2011-02-12 10:42:49

标签: c++

在构建我的小型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。

2 个答案:

答案 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