如何正确使用const(常量),define(宏)
时间:2022-05-16
本文章向大家介绍如何正确使用const(常量),define(宏),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
在开发中,也许我们会经常使用到宏定义,或者用const修饰一些数据类型,经常有开发者不知道怎么正确使用,导致项目中乱用宏定义与const修饰符。本篇主要介绍在开发中怎么正确使用const
与define(宏定义)
当我们想定义全局共用的一些数据时,比如通知名字,动画时长等等,我们可以用宏
、常量
、变量
:
- 宏: // 注意后面不需要带符号 #define ScottDidLoginSuccess @"登陆成功"
- 变量: // 注意后面一定要带符号 NSString *scottDidLoginSuccess = @"登陆成功";
- 常量:
// 四种写法
static const NSString *scottDidLoginSuccess = @"登陆成功";
const NSString *scottDidLoginSuccess = @"登陆成功";
NSString const *scottDidLoginSuccess = @"登陆成功";
NSString *const scottDidLoginSuccess = @"登陆成功";
那么问题来了,我们到底该如何选择呢? 让我来先将一下我对它们之间的理解吧:
-
宏:只是在预处理阶段进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化,只保存一份到数据段。甚至有相同后缀的字符串也可以优化,你可以使用GCC编译测试,
Hello world
与world
两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整型、浮点型会有多分拷贝,但这些数写在指令中,占的只是代码片段而且,大量使用宏会导致二进制文件变大。 - 变量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段做类型检查。
-
常量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以根据
const
修饰的位置设定能够修改,在编译阶段做类型检查。
常量区分
- 全局常量:不管你定义在任何文件夹,外部都能访问 const NSString *scottDidLoginSuccess = @"登陆成功";
- 局部常量:用static修饰后,不能供外界访问 static const NSString *scottDidLoginSuccess = @"登陆成功";
const修饰位置不同,代表什么
// 1.
const NSString *scottDidLoginSuccess = @"登陆成功";
// 2.
NSString const *scottDidLoginSuccess = @"登陆成功";
// 3.
NSString * const scottDidLoginSuccess = @"登陆成功";
咋一看,WTF,这不都张一样嘛,其实不一样,下面解释一下各代表什么
-
*scottDidLoginSuccess
不能被修改,scottDidLoginSuccess
能被修改 -
*scottDidLoginSuccess
不能被修改,scottDidLoginSuccess
能被修改,也就是和第一种情况是一样的 -
scottDidLoginSuccess
不能被修改,*scottDidLoginSuccess
能被修改。
结论:const
右边的总不能被修改
所以我们一般定义一个常量又不想被修改,应该这样定义:
NSString *const scottDidLoginSuccess = @"登陆成功";
两者之间的区别
-
define
在预处理阶段进行替换,const
常量在编译阶段使用; -
define
不做类型检查,只进行替换,const
常量有数据类型,会执行类型检查; -
define
不能调试,const
常量可以调试; -
define
定义的常量在替换后运行过程中,会不断占用内存,而const
定义的常量存储在数据段,只有一份拷贝,效率更高; -
define
可以定义函数,const
不可以。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Sqoop-1.4.7-部署与常见案例
- Hbase-2.0.0_01_安装部署
- 前端黑魔法之远程控制地址栏
- 攻击LNMP架构Web应用的几个小Tricks
- Hbase-2.0.0_02_常用操作
- phpjiami 数种解密方法
- Hbase-2.0.0_03_Hbase数据模型
- ELK-elasticsearch-6.3.2部署
- Real World CTF 2018 bookhub 总结
- python http.server open redirect vulnerability
- ELK-elasticsearch-6.3.2插件【head,bigdesk,cerebro[kopf]】安装
- ELK-kibana-6.3.2部署
- node.js + postgres 从注入到Getshell
- ELK-logstash-6.3.2部署
- K8S节点异常怎么办?TKE"节点健康检查和自愈"来帮忙