条款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
1948

被折叠的 条评论
为什么被折叠?



