【发布时间】:2012-03-23 22:02:00
【问题描述】:
我正在定义一个 NSString 以用作 NSError 中的错误域,并且正在复制 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 不抛出“重复符号”?
【问题讨论】:
-
如果您省略包含文件魔术,您的问题是否与以下相同:“我可以在同一源/二进制文件中执行两次 const int i=42; 吗?
-
是的,但还有“你如何不使用#defines 并在全局空间中使用 const”?可能吗?是首选吗? #define 有效,但为什么有 consts 呢?我是一个 java 人搬进了 Obj-c 我还没有获得 voodoo 101 的资格
-
你根本没有复制 ASIHttpRequest 正在做的事情。回去再看一遍。
标签: objective-c c constants linker-errors c-preprocessor