2009-12-15 19 views
2

我的印象是,使用#import只會在每次構建時導入一次文件,但在嘗試在頭文件中定義一個變量之後,然後將該頭文件導入到兩個不同的源文件中,我得到一個重複的符號鏈接器錯誤的變量。這怎麼可能?obj-c頭文件變量的重複符號

回答

6

#import使標頭被包含一次,每文件,但不是每個版本。所以你的變量是在導入你的頭文件的每個文件中定義的,並且因爲全局變量在整個項目中都是可見的,所以你會得到鏈接器錯誤。
正確的方式來定義一個全局變量(如果它是你想要做的)是在實現文件中定義它,並將其與其他文件中的關鍵字外部引用。
也定義變量標題爲靜態將限制其知名度的單個文件,所以你會得到沒有錯誤,但可能不是你想要的結果;)

+0

我相信你在說什麼。我很困惑,因爲根據維基百科,它是每個構建一次,除非我讀錯了: http://en.wikipedia.org/wiki/Objective-C#.23進口 您的解決方案完美地工作。謝謝。 – quano 2009-12-15 15:50:51

+0

#import每個編譯單元包含一次文件,在這種情況下,本質上意味着每個源文件。我不知道任何構建包含指令。 – sbooth 2009-12-16 04:35:07

+0

好的sbooth,謝謝你的澄清。 :) 我看到wikipedia文章也被編輯過。太好了! – quano 2009-12-16 18:00:54

2

#import確保了「宣言」只包含一次。由於你正在定義一個變量,它是一個'定義',它使你得到一個重複的符號鏈接器錯誤。

爲了解決這個錯誤 - 使用的.h只申報和.M用於定義

正如普京解釋說,你可以使用的extern

1

我有我已經建立了後一堆重複的符號突然出現新班。

終於意識到自己能夠做到這一點的.m文件:

#import "other-file.m" 

注意的 'M'。 :)