条款2

条款2

     我们学习C语言的时候,经常会用到预处理器语句,比如#define,#include,#ifdef,#endif.预处理语句是无法被编译器看见的 ,所以无法得到有效的错误提示.

     例如:#define ASPECT_RATIO 1.653

记号名称ASPECT_RATIO有可能没有进入记号表(symbol table)内.于是当你运用此常量获得一个编译错误信息时,错误信息的提示会提到1.653而不是ASPECT_RATIO,如果ASPECT_RATIO被定义在一个非自己写的头文件内,这样我们就需要花费时间去追踪错误.但想想是不是真的需要花费这样子的时间来纠正错误哪?其实用const替换#define就可以解决这个问题.

     const double AspectRatio=1.653;

因为const会被编译器看到,当然就会进入记号表内.错误提示的时候也就能很快的定位错误.

另外使用const还能产生比使用#define更小的码.因为预处理器盲目的将所有的ASPECT_RATIO替换为1.653,而改用常量则不会出现这种情况.

 

enum hack:

    (1)取一个const地址是合法的,但是取一个enum或者#define的地址通常是不合法的。如果你不想让别人获得一个指针或者引用指向你的某个整数常量,enum可以帮你实现这个约束。

    (2)

    

常量替换#defines的特殊情况:

    (1)定义常量指针

    (2)class专属常量:作用域和static,作用域确保常量限制于class内.static确保此常量至多只有一份实体.

 

 

总结:

     对于单纯常量,最好用const对象或enum替换#define

     对于形似函数的宏,最好使用inline函数代替#define

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值