我在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
所以我将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
但是有没有办法让const在全局空间中不要抛出'重复符号'?
答案 0 :(得分:51)
在您想要的标题文件中:
extern NSString *const FPServerAPIErrorDomain;
然后在一个实现文件中(所以你可能需要一个FPServerAPICoordinatorConstants.m
),你会想要:
NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";
然后,您可以将标头导入多个文件,但不会出现重复的符号错误。
[顺便说一句,如果您使用#ifndef
,则不需要#import
警卫。]
答案 1 :(得分:3)
无法在同一名称空间中两次实例化相同的(全局)变量(不会出现错误)。
答案 2 :(得分:1)
每个符号只应定义一次;也就是说,它应该只在一个m文件中定义。通过将定义放在头文件中,它将在包含该头文件的每个m文件中定义。
在你的一个m文件中定义它(以最相关的方式),并将标题中的内容更改为声明(使用extern关键字)。
该定义为数据腾出空间;声明只是告诉编译器在其他地方有一个定义。因此,每个使用常量的m文件都需要声明,但只有一个m文件应该有定义。