• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Objective-C中常量重复定义的解决方案

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  今天在项目中用到一些常用的字符串,于是我直接创建了一个constant.h文件用#define来定义。

  后来在网上看各位大神都建议用字符串常量来定义,于是我把所有的宏定义都换成了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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap