今天在项目中用到一些常用的字符串,于是我直接创建了一个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 : NSObjectextern NSString * const LJNextStep;@end

  这里使用到extern c关键字,表示这个变量已经声明,只是引用。const关键字表示变量是常量,不可修改。

  在.m文件中:

@implementation ConstantNSString * const LJNextStep = @"下一步";@end

转载于:https://www.cnblogs.com/ljios/p/4971529.html

Objective-C中常量重复定义的解决方案相关推荐

  1. java项目中常量规范定义的思考

    大言不惭,则无必为之志.--<论语·宪问> 1.引言 最近在看老大在项目中写的代码,发现在系统常量的定义上,与我之前在开发项目的定义有些不一样,引发了我对系统变量如何规范定义和每一种定义有 ...

  2. 解决C/C++语言中全局变量重复定义的问题

    前言 今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面.于是,想把自己的代码中的各个模块分离开来,以便更好地阅读和管理. 遇到的问题 我的做法是: 宏定义.结构体定义.函 ...

  3. InfluxDb中写入重复数据问题解决方案

    1.InfluxDb版本 0.10.3 2.Measurement TodayChargeTimeReport 只有time和Field列,没有Tag列 3.现象:通过定时任务向上面的表中写入数据: ...

  4. java项目中常量到底该怎么定义

    背景:由于最近要接手一个老的系统,在看代码逻辑的过程中,看到程序中有很多魔法数字,所以着手把系统中的常量单独提取出来,然后定义在常量类中.本来这样就可以完工了,可是我有俩疑问: 1,为什么要将常亮提取 ...

  5. 【spring源码学习】spring的aop目标对象中进行自我调用,且需要实施相应的事务定义的解决方案...

    转载:http://www.iteye.com/topic/1122740 1.预备知识 aop概念请参考[http://www.iteye.com/topic/1122401]和[http://ji ...

  6. VS中重复定义的解决方法

    error LNK2005: _DllMain@12 already defined in MSVC 方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难 ...

  7. java接口如何定义常量 c_在Java接口中怎样访问定义的常量呢?

    java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能).那么我们在Java接口中怎 ...

  8. C++中不允许重复定义全局变量

    文章目录 1 C++中不允许重复定义全局变量 1 C++中不允许重复定义全局变量 C++中不允许重复定义全局变量: 在C语言中,重复定义多个同名的全局变量是合法的. 在C++中,不允许定义多个同名的全 ...

  9. java 中for循环中重复定义的变量 为什么不报错?

    java 中for循环中重复定义的变量 为什么不报错? public class Test1 {public static void main(String[] args) {int[] arr = ...

  10. java——定义一个功能将ArrayList 集合中的重复元素删除(java集合七)

    定义一个功能将ArrayList 集合中的重复元素删除 ArrayList 集合中是允许储存重复元素的 import java.util.ArrayList; import java.util.Ite ...

最新文章

  1. android对话框的使用(下)
  2. 「SAP技术」SAP WM 如何根据TR号码查询TO号码?
  3. Java集合7 (NavigableSet)
  4. 无法打开物理文件 X.mdf。操作系统错误 5:5(拒绝访问。)
  5. shell中的变量赋值
  6. linux shell 脚本 2,理解Linux Shell和基本的Shell脚本(2)
  7. php 设定字符串编码格式,php设置字符串编码格式
  8. HiveSQL常用数据处理语句
  9. Android应用程序键盘(Keyboard)消息处理机制分析(26)
  10. 双时隙的工作原理_OFDM调制技术原理是什么 OFDM调制实现原理介绍【图文】
  11. Oracle用 odp.net 时出现 Oracle.DataAccess.Client.OracleConnection的类型初始值设定项引发异常 问题的解决...
  12. 【站点部署】解析二级域名并部署站点
  13. React 使用browserHistory项目访问404问题
  14. linux系统安装snort,linux下SNORT安装.doc
  15. sql之stuff函数学习笔记
  16. 如何在Word中打印奖状?按下这个键,就可以批量制作、打印奖状
  17. 有监督学习和无监督学习
  18. 学计算机应用技术掉头发,为什么程序员更容易脱发呢?
  19. Docker目录映射
  20. 在网上看到一篇很让人心水的三行情书,由此引发的种种

热门文章

  1. JAVA GUI设计
  2. java创建xml文件 编码_Mybatis Generator 1.4.0 通过java编码和xml文件配置
  3. 怎样找到一份深度学习的工作(附学习材料,资源与建议)
  4. 在计算机中 用于完成系统配置的文件是,历年真题:全国2015年4月自考02323操作系统概论考试试卷以及答案...
  5. Unity3D(六)光照系统
  6. Android将库导入到build.gradle
  7. java代码pingip_java代码ping一个IP地址
  8. 添加key_所写为方便日后查阅(添加SSHkey)
  9. java基础知识体系
  10. JDBC学习(四、DAO思想和重构设计上)