zoukankan      html  css  js  c++  java
  • Objective-C中常量重复定义的解决方案

      今天在项目中用到一些常用的字符串,于是我直接创建了一个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
  • 相关阅读:
    今天试了下lockerz,感觉国外的概念很先进
    十月一日,本人就结婚了,我和老婆选的婚礼主题曲,大家听听
    今天遇到了个奇怪的问题
    第一个博客,第一次随笔
    遇到一个奇葩的问题,could not load the assembly file XXX downloaded from the Web
    Log4net简单使用
    AutoWCFService心跳动态加载服务
    初学Service Broker
    新浪SAE云空间和SVN版本控制
    软件工程导论第一次作业
  • 原文地址:https://www.cnblogs.com/ljios/p/4971529.html
Copyright © 2011-2022 走看看