zoukankan      html  css  js  c++  java
  • 如何正确使用const(常量),define(宏)

    前言

    在开发中,也许我们会经常使用到宏定义,或者用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不可以。
  • 相关阅读:
    Windows Phone 7 Ti“.NET研究”ps (1) 狼人:
    Eclipse开发Android应用程序入“.NET研究”门:重装上阵 狼人:
    Android UI基本测验“.NET研究”:线性布局 狼人:
    “.NET研究”Eclipse开发Android应用程序入门 狼人:
    Window“.NET研究”s Phone 7 Tips (2) 狼人:
    文件位置修改strurs2中struts.xml文件的位置
    方法类struts2环境搭建
    平台程序微信平台开发应用的签名
    节点数据TYVJ P1742 [NOI2005]维护序列
    版本编译器Unsupported major.minor version 51.0
  • 原文地址:https://www.cnblogs.com/scott-mr/p/8947650.html
Copyright © 2011-2022 走看看