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 : NSObjectextern NSString * const LJNextStep;@end
这里使用到extern c关键字,表示这个变量已经声明,只是引用。const关键字表示变量是常量,不可修改。
在.m文件中:
@implementation ConstantNSString * const LJNextStep = @"下一步";@end
转载于:https://www.cnblogs.com/ljios/p/4971529.html
Objective-C中常量重复定义的解决方案相关推荐
- java项目中常量规范定义的思考
大言不惭,则无必为之志.--<论语·宪问> 1.引言 最近在看老大在项目中写的代码,发现在系统常量的定义上,与我之前在开发项目的定义有些不一样,引发了我对系统变量如何规范定义和每一种定义有 ...
- 解决C/C++语言中全局变量重复定义的问题
前言 今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面.于是,想把自己的代码中的各个模块分离开来,以便更好地阅读和管理. 遇到的问题 我的做法是: 宏定义.结构体定义.函 ...
- InfluxDb中写入重复数据问题解决方案
1.InfluxDb版本 0.10.3 2.Measurement TodayChargeTimeReport 只有time和Field列,没有Tag列 3.现象:通过定时任务向上面的表中写入数据: ...
- java项目中常量到底该怎么定义
背景:由于最近要接手一个老的系统,在看代码逻辑的过程中,看到程序中有很多魔法数字,所以着手把系统中的常量单独提取出来,然后定义在常量类中.本来这样就可以完工了,可是我有俩疑问: 1,为什么要将常亮提取 ...
- 【spring源码学习】spring的aop目标对象中进行自我调用,且需要实施相应的事务定义的解决方案...
转载:http://www.iteye.com/topic/1122740 1.预备知识 aop概念请参考[http://www.iteye.com/topic/1122401]和[http://ji ...
- VS中重复定义的解决方法
error LNK2005: _DllMain@12 already defined in MSVC 方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难 ...
- java接口如何定义常量 c_在Java接口中怎样访问定义的常量呢?
java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能).那么我们在Java接口中怎 ...
- C++中不允许重复定义全局变量
文章目录 1 C++中不允许重复定义全局变量 1 C++中不允许重复定义全局变量 C++中不允许重复定义全局变量: 在C语言中,重复定义多个同名的全局变量是合法的. 在C++中,不允许定义多个同名的全 ...
- java 中for循环中重复定义的变量 为什么不报错?
java 中for循环中重复定义的变量 为什么不报错? public class Test1 {public static void main(String[] args) {int[] arr = ...
- java——定义一个功能将ArrayList 集合中的重复元素删除(java集合七)
定义一个功能将ArrayList 集合中的重复元素删除 ArrayList 集合中是允许储存重复元素的 import java.util.ArrayList; import java.util.Ite ...
最新文章
- android对话框的使用(下)
- 「SAP技术」SAP WM 如何根据TR号码查询TO号码?
- Java集合7 (NavigableSet)
- 无法打开物理文件 X.mdf。操作系统错误 5:5(拒绝访问。)
- shell中的变量赋值
- linux shell 脚本 2,理解Linux Shell和基本的Shell脚本(2)
- php 设定字符串编码格式,php设置字符串编码格式
- HiveSQL常用数据处理语句
- Android应用程序键盘(Keyboard)消息处理机制分析(26)
- 双时隙的工作原理_OFDM调制技术原理是什么 OFDM调制实现原理介绍【图文】
- Oracle用 odp.net 时出现 Oracle.DataAccess.Client.OracleConnection的类型初始值设定项引发异常 问题的解决...
- 【站点部署】解析二级域名并部署站点
- React 使用browserHistory项目访问404问题
- linux系统安装snort,linux下SNORT安装.doc
- sql之stuff函数学习笔记
- 如何在Word中打印奖状?按下这个键,就可以批量制作、打印奖状
- 有监督学习和无监督学习
- 学计算机应用技术掉头发,为什么程序员更容易脱发呢?
- Docker目录映射
- 在网上看到一篇很让人心水的三行情书,由此引发的种种
热门文章
- JAVA GUI设计
- java创建xml文件 编码_Mybatis Generator 1.4.0 通过java编码和xml文件配置
- 怎样找到一份深度学习的工作(附学习材料,资源与建议)
- 在计算机中 用于完成系统配置的文件是,历年真题:全国2015年4月自考02323操作系统概论考试试卷以及答案...
- Unity3D(六)光照系统
- Android将库导入到build.gradle
- java代码pingip_java代码ping一个IP地址
- 添加key_所写为方便日后查阅(添加SSHkey)
- java基础知识体系
- JDBC学习(四、DAO思想和重构设计上)