ld:重复符号 - 由const引起

bri*_*ear 18 c const objective-c linker-errors c-preprocessor

我正在定义一个NSString用作NSError中的错误域,并且正在复制ASIHttpRequest在那里做的事情.

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";
Run Code Online (Sandbox Code Playgroud)

我把const放在它自己的.h文件// FPServerAPICoordinatorConstants.h中

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h
#define FirePlayer_FPServerAPICoordinatorConstants_h

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

#endif
Run Code Online (Sandbox Code Playgroud)

但是当我把它包含在一个以上的时候

SomeFile.m

#import "FPServerAPICoordinatorConstants.h"

SomeOtherFile.m

#import "FPServerAPICoordinatorConstants.h"
Run Code Online (Sandbox Code Playgroud)

我收到链接器错误'重复符号'

ld: duplicate symbol _FPServerAPIErrorDomain in SomeFile.o and ....SomeOtherFile.o for architecture armv7
Run Code Online (Sandbox Code Playgroud)

所以我将const更改为#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
Run Code Online (Sandbox Code Playgroud)

但有没有办法让const在全球空间不要抛出"重复的符号"?

mat*_*way 53

在您想要的头文件中:

extern NSString *const FPServerAPIErrorDomain;
Run Code Online (Sandbox Code Playgroud)

然后在一个实现文件中(所以你可能想要一个FPServerAPICoordinatorConstants.m)你会想要:

NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";
Run Code Online (Sandbox Code Playgroud)

然后,您可以将标头导入多个文件,而不会出现重复的符号错误.

[顺便说一句,#ifndef如果你正在使用,你不需要警卫#import.]