2011-07-01 44 views
4

我有以下文件testf.h:編譯下用Objective-C和重複符號鏈接器錯誤(iPhone相關)

#ifndef TESTF_H_ 
#define TESTF_H_ 
int test(int what){ 
    return what; 
} 
#endif 

我包括/進口它在TestAppDelegate.h(其被用於其它。 m文件在我的xcode項目中)。我得到一個重複的符號錯誤。如果我在.m文件中包含/導入testf.h文件,該文件從不包含/導入其他文件,那麼它工作正常。所以看起來#ifndef/#define/#endif沒有效果。無論如何去解決這個問題?

由於

回答

4

這是一個函數定義,它屬於在C,CPP或米文件。

#defines這個流行的技巧將保護你免受編譯器錯誤(通常生存循環#include依賴項)。它不會防止鏈接器錯誤。這就是爲什麼人們將聲明放在c文件和m文件中的h文件和定義中的原因。

+0

動了我的定義,以C文件並保持的H嚴格的聲明。工作。謝謝你,先生。 – cisgreat

+0

檢查此答案:http://stackoverflow.com/a/7126410/313480 –

4

在頭文件中包含函數定義(而不是聲明)通常是一個壞主意,現在你知道爲什麼了。你想兩個獨立的文件,標題是這樣的:

#ifndef TESTF_H_ 
#define TESTF_H_ 
extern int test(int); 
#endif 

然後一個.c文件(或者可能是.m文件,如果你想使用的Objective-C,而不是普通的C)是這樣的:

int test(int what) { 
    return what; 
} 

頭文件將讓編譯器知道什麼是test,它返回什麼以及它應該採用什麼參數;這是足夠的信息讓編譯器安排調用test;這實際上比編譯器需要更多的信息,但我們中的一些人喜歡我們的編譯器來做一些錯誤檢查。 C源代碼文件(在編譯成目標文件後)將讓鏈接器知道test符號可以解析的代碼。

現在您可以看到test符號的多個全局可見實例,其中一個用於包含您的testf.h的每個文件。

1

另一種選擇,一個簡單的功能,就是聲明它inline

inline int cNorm(float _amp) { 
    return 42; 
}