2011-02-12 36 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