博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何正确使用const(常量),define(宏)
阅读量:4670 次
发布时间:2019-06-09

本文共 1733 字,大约阅读时间需要 5 分钟。

前言

在开发中,也许我们会经常使用到宏定义,或者用const修饰一些数据类型,经常有开发者不知道怎么正确使用,导致项目中乱用宏定义与const修饰符。本篇主要介绍在开发中怎么正确使用constdefine(宏定义)

当我们想定义全局共用的一些数据时,比如通知名字,动画时长等等,我们可以用常量变量

  • 宏:

    // 注意后面不需要带符号    #define ScottDidLoginSuccess @"登陆成功"
  • 变量:

    // 注意后面一定要带符号    NSString *scottDidLoginSuccess = @"登陆成功";
  • 常量:

    // 四种写法    static const NSString *scottDidLoginSuccess = @"登陆成功";    const NSString *scottDidLoginSuccess = @"登陆成功";    NSString const *scottDidLoginSuccess = @"登陆成功";    NSString *const scottDidLoginSuccess = @"登陆成功";

那么问题来了,我们到底该如何选择呢?

让我来先将一下我对它们之间的理解吧:

  • 宏:只是在预处理阶段进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化,只保存一份到数据段。甚至有相同后缀的字符串也可以优化,你可以使用GCC编译测试,Hello worldworld两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整型、浮点型会有多分拷贝,但这些数写在指令中,占的只是代码片段而且,大量使用宏会导致二进制文件变大。
  • 变量:共享一块内存空间,就算项目中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,这不都张一样嘛,其实不一样,下面解释一下各代表什么

  1. *scottDidLoginSuccess不能被修改,scottDidLoginSuccess能被修改
  2. *scottDidLoginSuccess不能被修改,scottDidLoginSuccess能被修改,也就是和第一种情况是一样的
  3. scottDidLoginSuccess不能被修改,*scottDidLoginSuccess能被修改。

结论:const右边的总不能被修改

所以我们一般定义一个常量又不想被修改,应该这样定义:

NSString *const scottDidLoginSuccess = @"登陆成功";

两者之间的区别

  • define在预处理阶段进行替换,const常量在编译阶段使用;
  • define不做类型检查,只进行替换,const常量有数据类型,会执行类型检查;
  • define不能调试,const常量可以调试;
  • define定义的常量在替换后运行过程中,会不断占用内存,而const定义的常量存储在数据段,只有一份拷贝,效率更高;
  • define可以定义函数,const不可以。

转载于:https://www.cnblogs.com/scott-mr/p/8947650.html

你可能感兴趣的文章
默认情况下安装的应用程序C盘后提示权限不足,当你开始介意。。。
查看>>
su root 后还是不能使用useradd ,useradd 等命令
查看>>
URL.createObjectURL图片预览
查看>>
js 中exec、test、match、search、replace、split用法
查看>>
Android开发笔记(一)手势识别
查看>>
mybatis 复习笔记03
查看>>
zoj 3703(背包)
查看>>
一种新的子波域滤波算法
查看>>
cookie之三天免登录代码
查看>>
1043 幸运号码 数位DP
查看>>
js18
查看>>
2018-2019-2 20175308实验一 《Java开发环境的熟悉》实验报告
查看>>
如何设置WIN7自动登录(去除登录密码)
查看>>
关于bash中if语法结构的广泛误解(转)
查看>>
10G整数文件中寻找中位数或者第K大数
查看>>
操作手机数据库的uri
查看>>
Python小应用1 - 抓取网页中的链接地址
查看>>
HTML表格和列表笔记&练习<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>关于表格的一些练...
查看>>
Hadoop HBase概念学习系列之hbase shell中执行java方法(高手必备)(二十五)
查看>>
数据类型
查看>>