C++学习笔记  指针与引用的区别

来源:互联网 发布:盐与避难所 mac 汉化 编辑:程序博客网 时间:2024/06/05 05:41

define: 宏定义。 在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。由预处理器处理。

define ASPECT_RATIO 1.653

记号名称ASPECT_RATIO也许从未被编译器看见,在编译器处理源代码之前就可能被预处理器移走了。于是记号就有可能没有进入到符号表中。(在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址)这样当使用该常量但获得编译错误信息时,错误信息可能只有1.653,而不会提到ASPCT_RATIO,而这个宏定义可能位于别人写的一个头文件中,这样你就无从查起,这个1.653是啥呢?Only God knows。 因为它可能没被记录到符号表中。

解决办法1:用一个常量替换上面的宏(#define)。
const double ASPECT_RATIO = 1.653
作为一个语言常量,肯定会被编译器看到,并被记录到符号表中。而且对于float型常量来说,使用常量会比使用宏定义需要更少的码,因为预处理器“盲目地将宏名称ASPECT_RATIO替换为 1.653可能会导致目标码(object code)中出现多份1.653”。若改用常量就不会出现这种情况。

解决办法2:使用内联函数
内联函数和普通函数相比可以加快程序运行的速度,inline在调用函数的时候无需跳转到另一个位置来执行代码,而是直接把代码写到那里去,如果多次调用一个内联函数,则在程序内存中将包含多个函数代码的副本.这是一种以空间换取时间的做法
inline相比宏定义有以下两个优点:
1.内联函数要做参数类型检查,具有更高的安全性
2.内联函数具有更高的灵活性,例如下面的例子:
使用内联实现求平方

inline double square(double x) { return x*x;}double a,b;double c = 13.0;a = square(5.0)   //正常执行b = square(4.5+7.5) //正常执行cout<<square(c++) //正常执行

使用#define

#define SQUARE(X) X*Xdouble a,bdouble c = 13.0;a = square(5.0)   //正常执行b = square(4.5+7.5) //不能正常执行cout<<square(c++) //不能正常执行

define不能正常执行下面两种,因为define实现的函数不是通过传递参数实现的,而是通过文本替换实现的.
总之,如果使用C语言的宏执行了类似函数的功能,应该考虑将它们转换成内联函数.

0 0
原创粉丝点击