2011-12-22 26 views
1

我試圖編譯一個簡單的測試程序,並且該頭文件我包括的一個具有的typedef關於未定義的引用的typedef

typedef const char* CharConst; 
typedef unsigned int MyBool; 

在頭文件以後以下,某些功能被定義克++錯誤使用這個typedef。這樣的東西:

MyBool add_att(CharConst attr, const char*); 

我得到一個錯誤,當我試圖讓這個函數的調用,與像一個電話:

CharConst myconst = "some text"; 
const char* more_text = "more text"; 
add_att(myconst, more_text); 

的錯誤是:未定義的引用`MyClass的:: add_att (char const *,char const *)'

似乎編譯器不喜歡第一個參數在頭文件中被typedef'd的事實。但它並不介意MyBool。編譯器只會抱怨CharConst定義。

有沒有簡單的方法可以解決這個問題?我能做什麼的任何線索或提示?我正在運行gcc版本4.6.2

+2

在定義中顯示函數簽名。也不要在指針類型上使用'typedef',這會讓人感到困惑,而且這些問題總是伴隨着它。 –

+0

您是否在您嘗試調用該函數的文件中包含聲明/定義了'add_att()'的頭文件? 'add_att()'是在一個庫中定義的,你忘了鏈接到那個庫? –

+0

'typedef'不應該有任何區別(不要混淆任何試圖閱讀代碼的人)。它看起來好像你沒有實現這個函數,或者你沒有鏈接到包含它的實現的文件。 –

回答

0

從錯誤它看起來像add_att是類的方法;我沒有看到你的類的實例調用該方法。考慮一下:MyClass * m = new MyClass(); m_> add_att(....)

或者,確保該函數實際上已定義,而不僅僅是原型。此外,這可能並不重要,但在函數的定義過程中 - 是否在函數參數中使用typedef?其實這應該不重要...類型是一樣的。

+0

我已經進一步瞭解了這一點。結果我的gcc版本(這是非常新的)不能很好地與靜態鏈接,我需要靜態鏈接在這個庫(.a文件)。我正在重新編譯庫來使用共享對象(奇怪的是,這不是用於此庫的默認方式)。將盡快重試。 – jasonmclose

+0

這很可能是它;但是,儘量避免責怪編譯器,除非您已經在同一硬件上使用另一個版本進行了測試。 我喜歡責怪編譯器和驅動程序(男孩我喜歡責怪司機!)但大多數時候它是在你的盡頭,或其他庫。嘗試使用不同版本的GCC進行測試;雖然4.6.2對我來說工作得很好(解決了比創建大聲笑更多的問題)。 – Kaa

+0

好的。這已成爲我如何編譯的問題。 – jasonmclose