objective-c - ld : duplicate symbol - caused by const

标签 objective-c c constants linker-errors c-preprocessor

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

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

我把常量放在它自己的 .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 不抛出“重复符号”?

最佳答案

在你想要的头文件中:

extern NSString *const FPServerAPIErrorDomain;

然后在一个实现文件中(所以您可能需要一个 FPServerAPICoordinatorConstants.m),您需要:

NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

然后您可以将 header 导入多个文件而不会出现重复符号错误。

[顺便说一下,如果您使用的是 #import,则不需要 #ifndef 守卫。]

关于objective-c - ld : duplicate symbol - caused by const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9583473/

相关文章:

java - 根据使用库的应用程序更改库中定义的常量变量 [Android-Java]

c++ - 在将 constexpr 添加到语言后,将变量声明为 const 是多余的吗?

ios - 在我们自己的声明方法中如何获取单元格选择行呢?

iphone - 应用程序与 iphone 5 屏幕尺寸的兼容性

c - 如何从全局内存或纹理内存中获取 16 字节

c - 当 typedef 是全局而非局部时,为什么定义与函数同名的 typedef 会出错?

objective-c - 为什么 self.view 的高度和宽度与 subview 的高度和宽度不同?

ios - AVExportSession 适用于模拟器、iPad 2 但不适用于 iPad 4

c - Hp VuGen 11.5 基本相关空白值

c++ - 如何允许临时对象使用非常量复制构造函数