Objective-C中常量重复定义的解决方案
2015-11-17 14:04
531 查看
今天在项目中用到一些常用的字符串,于是我直接创建了一个constant.h文件用#define来定义。
后来在网上看各位大神都建议用字符串常量来定义,于是我把所有的宏定义都换成了NSString * const,比如NSString * const LTNNextStep = @"下一步";
该.h文件主要在两个类中使用,但是#import该文件后发现了一个链接问题:
原来,书中说在标准C中const定义的变量是外连接的,即如果一个编译单元中定义了一个全局const常量,则其在其他编译单元中是可见的,如果其他编译单元也定义了同名const常量就会产生重复定义错误。这一点与C++不同,C++中const定义的变量是内连接的,即每个编译单元定义的全局const常量是自己独有的。
Objective-C是标准C的另一种扩展,那么我犯的错误也就很明显了——当多个编译单元都引用那个constant.h文件时出现了重复定义错。
但是将
NSString * const,比如NSString * const LTNNextStep = @"下一步";
修改为
static NSString * const,比如NSString * const LTNNextStep = @"下一步";
就顺利编译通过了。这里的static是用来把定义的const常量标记为对外不可见的。
目前我的基础知识还不扎实,因此也说不出个所以然。以后会再仔细研究研究。
用通用的方法,直接创建一个.h和一个.m文件,在.h文件中:
这里使用到extern c关键字,表示这个变量已经声明,只是引用。const关键字表示变量是常量,不可修改。
在.m文件中:
后来在网上看各位大神都建议用字符串常量来定义,于是我把所有的宏定义都换成了NSString * const,比如NSString * const LTNNextStep = @"下一步";
该.h文件主要在两个类中使用,但是#import该文件后发现了一个链接问题:
ld:11 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
原来,书中说在标准C中const定义的变量是外连接的,即如果一个编译单元中定义了一个全局const常量,则其在其他编译单元中是可见的,如果其他编译单元也定义了同名const常量就会产生重复定义错误。这一点与C++不同,C++中const定义的变量是内连接的,即每个编译单元定义的全局const常量是自己独有的。
Objective-C是标准C的另一种扩展,那么我犯的错误也就很明显了——当多个编译单元都引用那个constant.h文件时出现了重复定义错。
但是将
NSString * const,比如NSString * const LTNNextStep = @"下一步";
修改为
static NSString * const,比如NSString * const LTNNextStep = @"下一步";
就顺利编译通过了。这里的static是用来把定义的const常量标记为对外不可见的。
目前我的基础知识还不扎实,因此也说不出个所以然。以后会再仔细研究研究。
用通用的方法,直接创建一个.h和一个.m文件,在.h文件中:
@interface Constant : NSObject extern NSString * const LJNextStep; @end
这里使用到extern c关键字,表示这个变量已经声明,只是引用。const关键字表示变量是常量,不可修改。
在.m文件中:
@implementation Constant NSString * const LJNextStep = @"下一步"; @end
相关文章推荐
- ldap获取数据中的objectGUID乱码问题
- [CareerCup] 14.5 Object Reflection 对象反射
- Objective-c:属性
- NSDate和NSString之间的相互转换
- 第五章Object-C类
- 解决在使用client object model的时候报“object does not belong to a list”错误
- 使用Masonry创建一个下拉式菜单
- Finding a Custom Object Id (01I…) to get the Setup page URL
- Objective-C基础-初次学习
- Objective-c(2)
- [super dealloc]内存释放的先后顺序
- Object-C,NumberDemo和StringDemo
- Object-C,NumberDemo和StringDemo
- Object-C,NumberDemo和StringDemo
- Object Overlay on Video
- Object-C之Protocol协议解析
- ARC小结
- Objective-c:内存管理
- Objective-C运行时定义的几种重要的类型
- 常用的四种算法