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
.]