2012-03-06 16 views
15

我在NSError中定義了一個NSString作爲錯誤域,並且正在複製ASIHttpRequest如何做。ld:重複的符號 - 由const引起的

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

我把常量在它自己的.h文件中 // FPServerAPICoordinatorConstants.h

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h 
#define FirePlayer_FPServerAPICoordinatorConstants_h 

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

#endif 

,但是當我在一個以上的.m

SomeFile.m 

#import "FPServerAPICoordinatorConstants.h" 

SomeOtherFile.m 

#import "FPServerAPICoordinatorConstants.h" 

它包含了我連接錯誤 '重複的符號'

ld: duplicate symbol _FPServerAPIErrorDomain in SomeFile.o and ....SomeOtherFile.o for architecture armv7 

所以我將常量改爲#define,它工作正常。

// FPServerAPICoordinatorConstants.h 

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h 
#define FirePlayer_FPServerAPICoordinatorConstants_h 


//THIS WAS TRIGGERING link errors 
//NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 
//working OK 
#define FPServerAPIErrorDomain @"FPServerAPIErrorDomain" 

#endif 

但是有沒有辦法讓全局空間中的const不拋出'重複符號'?

+2

,如果你離開了包括文件魔力,是你的問題一樣:「我該怎麼辦** const int的I = 42; **在相同的源/二進制兩次 – 2012-03-06 12:18:25

+0

肯定的,但也「你怎麼不?使用#defines和在全局空間中使用const?是否有可能?它是首選?#define工作,但爲什麼有常量?Im一個java人搬入Obj-c我沒有在Voodoo 101合格但尚未 – 2012-03-06 12:23:13

+0

您尚未複製什麼ASIHttpRequest做所有回去再看看 – hooleyhoop 2012-03-06 12:38:37

回答

47

在你的頭文件,你想:

extern NSString *const FPServerAPIErrorDomain; 

,然後在實現文件(所以有可能你想有一個FPServerAPICoordinatorConstants.m),你會想:

NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

然後你可以導入頭到多個文件並且不會出現重複的符號錯誤。

[順便說一句,如果你使用#import你不需要#ifndef警衛]

+0

公頃AP!當我從模板中添加頭文件時,把ifndef放在:) – 2012-03-06 12:37:52

+0

這可能是因爲你是從「C頭」模板添加的。如果你使用C風格的'#include's,那麼默認情況下它們會處於你想要的狀態。但是你正在使用Objective-C風格的'#import's。所以擺脫守衛。 – mattjgalloway 2012-03-06 12:39:18

+0

非常感謝您的回答。爲我節省時間。 – Yanhua 2013-12-27 04:28:16

3

這是不可能的兩次實例相同(全局)變量在同一個命名空間(,沒有得到一個錯誤)。

+1

是有使用 //的NSString * const的FPServerAPIErrorDomain = @ 「FPServerAPIErrorDomain」 的任何優勢; 超過 的#define FPServerAPIErrorDomain @ 「FPServerAPIErrorDomain」 – 2012-03-06 12:39:27

1

每個符號只能定義一次;也就是說,它只能在一個m文件中定義。通過將定義放在頭文件中,它將在每個包含該頭文件的m文件中定義。

定義它在你的M檔(無論是最相關的)之一,並改變你有什麼在標題中聲明(使用extern關鍵字)。

該定義爲數據創建空間;該聲明只是告訴編譯器其他地方有一個定義。因此,每個使用常量的m文件都需要聲明,但只有一個m文件應該具有該定義。

+0

是否有任何優勢使用 // NSString * const FPServerAPIErrorDomain = @「FPServerAPIErrorDomain」; over #define FPServerAPIErrorDomain @「FPServerAPIErrorDomain」 – 2012-03-06 12:40:17

相關問題