摒弃:
#define ANIMATION_DURATION 0.3
 
#define ERROR_MESSAGE @“ErrorMessage”
1)没有常量的类型信息
2)假设此指令声明在某个头文件中,那么所有引入了这个头文件的代码,都可以访问和修改ANIMATION_DURATION。
 
推荐:
1、私有常量
.m文件
static const NSTimeInterval kAnimationDuration = 0.3;
 
static NSString *const kErrorMessage = @“ErrorMessage”;
 
2、公开常量
.h文件
extern const NSTimeInterval PersonModelAnimationDuration;
 
extern NSString *const PersonModelErrorMessage;
 
.m文件
const NSTimeInterval PersonModelAnimationDuration = 0.3;
 
NSString *const PersonModelErrorMessage = @“ErrorMessage”;
 
几点说明:
1、常量名称的常用命名方法:若常量局限于某“编译单元”,也就是“实现文件”之内,则在前面加字母k;若常量在类之外可见,则通常以类名为前缀。
 
2、在头文件里声明预处理指令来定义常量,这样做真的非常糟糕,当常量名称有可能互相冲突时更是如此。
 
3、私有变量一定要同时使用static与const来声明。如果试图修改由const修饰符所声明的变量,那么编译器就会报错。而static修饰符则意味着该变量仅在定义此变量的编译单元中可见。编译器每收到一个编译单元,就会输出一份“目标文件(object file)”在Objective-C的语境下,“编译单元”一词通常指每个类的实现文件(以.m为后缀名)。因此,在上述范例代码中声明的kAnimationDuration变量,其作用域仅限于由PersonModel.m锁生成的目标文件中。假如声明此变量时不加static,则编译器会为它创建一个“外部符号”。此时,若是另一个编译单元中也声明了同名变量,那么编译器就会抛出一条错误消息。
 
4、事实上,如果一个变量既声明为static,又声明为const,那么编译器根本不会创建符号,而是会像#define预处理指令一样,吧所有遇到的变量都替换为常量。不过,区别是,用这种方法定义的常量是带有类型信息的。
 
5、全局常量需要放在“全局符号表”中,以便可以在定义该常量的编译单元之外还用。因此全局常量是会创建符号的。
 
6、extern这个关键字是要告诉编译器,在全局符号表中将会有一个名为***的符号。也就是说,编译器无须查看其定义,即允许代码使用此常量。因为它知道,当链接成二进制文件之后,肯定能够找到这个常量。因此,此类常量必须定义,而且只能定义一次。通常将其定义在与声明该常量的头文件相关的实现文件里。
 

多用类型常量,少用#define预处理指令的更多相关文章

  1. Effective Objective-C 2.0 — 第四条:多用类型常量,少用#define预处理指令

    第四条:多用类型常量,少用#define预处理指令 使用#define 预处理的坏处:定义出来的常量没有类型信息,编译器只是会在编译前据此执行查找与替换操作.即使有人重新定义了常量值,编译器也不会产生 ...

  2. 52个有效方法(4) - 多用类型常量,少用#define预处理指令

    局部常量 在实现文件中使用 static const 来定义"只在编译单元内可见的常量"(translation-unit-specific constant).其命名规则为在前面 ...

  3. 第4条:多用类型常量,少用#define预处理指令

    定义常量的几种方式: 1.#define ANIMATION_DURAION 0.3         //定义了一个动画时长的常量, 预处理过程会把碰到的所有ANIMATION_DURAION一律替换 ...

  4. C语言中的#define预处理指令

    本文链接:http://www.cnblogs.com/xxNote/p/4009460.html 今天看C Primer Plus里面看449页里面 16.2.1语言符号 讲到从技术方面看,系统把宏 ...

  5. 关于#define预处理指令的一个问题

    背景:由于经常需要在远程服务端和测试服务端进行切换,所以将接口的地址定义为了一个预处理变量,例如 //#define APIDOMAIN @"http://10.0.0.2" #d ...

  6. C/C++预处理指令#define,#ifdef,#ifndef,#endif…

    2016年12月29日更新: 今天查看以前文件的时候, 突然发现了#error 这个预处理指令.然后回想一下工作, 发现这个指令使用场景还是很多的.比如: 一个项目的模块儿之多,源文件之大,代码之多, ...

  7. C/C++预处理指令#define,#ifdef,#ifndef,#endif… (转)

    本文转自博文C/C++预处理指令#define,#ifdef,#ifndef,#endif….这篇博文写得特别好,特转载. 本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何 ...

  8. C/C++预处理指令#include,#define,#undef,#if,#ifdef,#ifndef,#elif,#endif,#error......

    本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下 ...

  9. C/C++预处理指令#define,条件编译#ifdefine

    本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下 ...

随机推荐

  1. 消息队列(四)--- RocketMQ-消息发送

    概述 RocketMQ 发送普通消息有三种 可靠同步发送 可靠异步发送 单向(oneway)发送 :只管发送,直接返回,不等待消息服务器的结果,也不注册回调函数,简单地说,就是只管发,不管信息是否发送 ...

  2. HDU 1312 Red and Black(经典DFS)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 一道很经典的dfs,设置上下左右四个方向,读入时记下起点,然后跑dfs即可...最后答 ...

  3. win10鼠标右击 新建文件夹 反应缓慢、迟钝

    1. 先使用360杀毒,步骤如下: 2.修改注册表 https://jingyan.baidu.com/article/363872ec9e25972e4ba16f82.html 3.  如果仍未解决 ...

  4. 【STM32H7教程】第57章 STM32H7硬件JPEG编解码基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第57章       STM32H7硬件JPEG编解码基础知识 ...

  5. matlab学习记录

    1.在命令框输入preferences,可以调整字体大小 2.产生正太分布函数 参考:https://blog.csdn.net/s334wuchunfangi/article/details/816 ...

  6. lena全身像

    数字图像处理中,Lena(Lenna)是一张被广泛使用的标准图片,特别在图像压缩的算法研究中 (为什么用这幅图,是因为这图的各个频段的能量都很丰富:即有低频(光滑的皮肤),也有高频(帽子上的羽毛),很 ...

  7. Cisco Cat4500系列High CPU故障步骤摘要

    在实际网络环境中,很多时候都会出现设备high CPU的情况,有些时候可能是bug,而某些情况下,也可能是网络中发生了变化,导致了设备出现high CPU情况,这里主要记录一下Cisco Cat450 ...

  8. floyd的魔改应用——洛谷P2419 [USACO08JAN]牛大赛Cow Contest 题解

    想找原题请点击这里:传送门 原题: 题目背景 [Usaco2008 Jan] 题目描述 N ( ≤ N ≤ ) cows, conveniently numbered ..N, are partici ...

  9. idea提示非法字符

    问题: 解决方法: 将编码格式UTF-8+BOM文件转为普通的UTF-8文件. 一.简单方法,在AS右下角,将编码改为GBK,再转为UTF-8,可以解决. 二.可以用EditPlus 1.将文件用Ed ...

  10. Python回收机制

    1.小整数对象池 整数在程序中的使用非常广泛,python 为了优化速度,使用了小整数对象池,避免整数频繁申请和销毁和内存空间. Python 对小整数的定义事[-5, 257]这些整数对象的hi提前 ...