1.const 与 #define的比较
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只是在编译开始时进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应);
2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
2.typedef的作用
1)类型说明typedef
类型说明的格式为:typedef 类型 定义名;
类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。
例如: 用下面语句定义整型的新名字:
typedef int SIGNED_INT;
使用说明后, SIGNED_INT就成为int的同义词了, 此时可以用SIGNED_INT 定
义整型变量。
例如: SIGNED_INT i, j;(与int i, j等效)。
但 long SIGNED_INT i, j; 是非法的。
typedef同样可用来说明结构、联合以及枚举和类。
说明一个结构的格式为:
typedef struct{
数据类型 成员名;
数据类型 成员名;
...
} 结构名;
此时可直接用结构名定义结构变量了。例如:
typedef struct{
char name[8];
int class;
char subclass[6];
float math, phys, chem, engl, biol;
} student;
student taoge;
则taoge被定义为结构数组和结构指针。
注意:typedef定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。
2)可以用来定义与平台无关的类型,提高代码的可移植性
最近在代码里看到广为使用的typedef,起初以为typedef和define差不多,后来才发现前者比后者的功能更为强大。
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。
另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。
3)为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。这点虽然理解,但在实际中自己用的较少,需要多看看。例如:
原声明:int *(*a[5])(int, char*);
变量名为a,直接用一个新别名pFun替换a就可以了:
typedef int *(*pFun)(int, char*);
原声明的最简化版:
pFun a[5];
两种模式: type (*)(....)函数指针
type (*)[]数组指针
4)用typedef可以声明各种类型名,但不能用来定义变量;
5)typedef与#define有相似之处;如typedef int COUNT;和#define COUNT int;都是用“COUNT” 代替int。但二者的实质不同:#define在预编译时处理,它只作简单的字符串替换;而typedef则在编译时处理,并且不是作字符串替换,而是采用如同定义变量的方法来声明一个类型。
6)当不同的源文件中用到同一种数据类型(尤其是像数组、指针、结构体、共用体等类型)时,常用typedef声明一些数据类型,并把它们单独放在一个文件中,然后在需要用到这些类型数据的文件中用#include命令把它们包含进来。