2011-02-12 37 views
5

在构建我的小C++项目时,我得到以下2个错误,无法找出原因:错误时向前声明一个结构:“在这里有一个先前的声明”

  • 错误:使用的typedef 'struct'之后的名字'TTF_Font'。
    指向以下代码行:struct TTF_Font; in Foo.h.

  • 错误:'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 

主要.cpp:

#include "Foo.h" 
int main(int argc, const char* argv[]) 
{ 
    Foo a; 
    return 0; 
} 

你们知道我在做什么错吗?

我的目标是转发声明TTF_Font,所以我可以在我的头文件中使用它,而不包括SDL_ttf头文件。我读过在其他头文件中包含头文件是一个不好的做法,所以我切换到前向声明。除了这个单独的结构外,我所有其他的前向声明都能正常工作

当我用正文包括#include "SDL/SDL.ttf.h"替换正向声明struct TTF_Font;时,它编译时没有错误。所以我可以使用它,但我想知道为什么,该死的:-)。

其他信息:我正在使用Code :: Blocks IDE和mingw32编译器。项目使用SDL图形库。没有太多的C++经验,来自C#背景。

+0

你确定你的`Foo.cpp`代码片断是正确的吗?错误信息暗示``Foo.h`中的内容在包含`SDL_ttf.h`后发生*。 – 2011-02-12 10:45:38

回答

8

您正在尝试将某种东西作为不同类型来声明它实际上是什么。

您声明:

struct TTF_Font; 

当错误信息表明TTF_Font实际上是一个typedef,而不是一个struct

typedef struct _TTF_Font TTF_Font; 

的stuct实际上是所谓_TTF_Font

您可以在同一typedef多次声明,所以你可以只使用typedef声明,而不是向前声明的申报struct并介绍typedef虽然它确实感觉有点像你正在使用的报头的实现细节,你正试图推迟包括。

+2

谢谢!当我使用头文件中的相同typedef行时,它的工作原理就像你已经提到的那样,它使用了SDL_ttf头文件的细节。这种事情有最佳做法吗?我是否应该忽略前向声明,并在这种情况下简单地包含头文件? – 2011-02-12 11:16:43

2

的问题是,在这个代码片段:

struct foo_t; 

typedef struct foo { ... } foo_t; 

第一行是不同结构,他的名字与typedef冲突的正向声明。在这种情况下的前向声明需要为struct foo;,因为struct本身的名称是foo