Objective c ld:重复符号-由常量引起

Objective c ld:重复符号-由常量引起,objective-c,c,constants,linker-errors,c-preprocessor,Objective C,C,Constants,Linker Errors,C Preprocessor,我在NSError中定义了一个NSString用作错误域,并复制了ASIHttpRequest的工作方式 NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 我将const放在它自己的.h文件中 //FPServerAPICoordinatorConstants.h #ifndef FirePlayer_FPServerAPICoordinatorConstants_h #define FirePlayer_F

我在NSError中定义了一个NSString用作错误域,并复制了ASIHttpRequest的工作方式

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";
我将const放在它自己的.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

但是,有没有一种方法可以使全局空间中的常量不抛出“重复符号”?

不可能在同一名称空间中实例化同一(全局)变量两次(,而不会出错)。

在头文件中,您需要:

extern NSString *const FPServerAPIErrorDomain;
然后在一个实现文件中(因此您可能需要一个
FPServerAPICoordinatorConstants.m
),您需要:

NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";
然后,您可以将头导入多个文件,而不会出现重复的符号错误


[顺便说一句,如果您使用的是
\import
,则不需要
\ifndef
防护装置]

每个符号只能定义一次;也就是说,它应该只在一个m文件中定义。通过将定义放在头文件中,它将在包含该头文件的每个m文件中定义

在一个m文件中定义它(以最相关的文件为准),并将标题中的内容更改为声明(使用extern关键字)


定义为数据留出了空间;声明只是告诉编译器在其他地方有一个定义。因此,每个使用常量的m文件都需要有一个声明,但只有一个m文件应该有定义。

如果省略include file magic,您的问题是否与以下相同:“我能做常数I=42;在同一个源代码/二进制文件中两次?是的,但也“如何不使用#定义并使用全局空间中的常量”?可能吗?是首选吗#定义工作,但为什么有常数呢?我是一个java人,搬到了Obj-c。我还没有通过voodoo 101认证。是的,你根本没有复制AsitpRequest正在做的事情。回去再看看,哈!当我从模板添加头文件时,apple将ifndef放在:)中,这可能是因为您是从“C头”模板添加的。如果您使用C-style
#include
s,则默认情况下会将它们放入。但是您使用的是Objective-C-style
#import
s。所以,把警卫赶走。非常感谢你的回答。为我节省时间。使用//NSString*const fpserver apierrormdomain=@“fpserver apierrormdomain”有什么好处吗;在#define fpserverapierrodomain@“fpserverapierrodomain”上使用//NSString*const fpserverapierrodomain=@“fpserverapierrodomain”有什么好处吗;超过#定义FPServerAPIErrorDomain@“FPServerAPIErrorDomain”