关键字 typedef : 顾名思义类型定义,这里应该理解为类型重命名,从而增强程序的可读性。
例如:
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main(){
unsigned int num1=0; //观察num1和num2,这两个变量的类型是一样的
uint_32 num2=0;
return 0;
}
关键字define:定义一个标识符来表示一个常量。
- #define又称宏定义,标识符为所定义的宏名,简称宏。其功能是将标识符定义为其后的常量。
- 特点是:
定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
在这里呢,顺便一提预编译:预编译又叫预处理。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。
- 一般形式为:
#define 标识符 常量 //注意, 最后没有分号
例如:
#define MAX 1000 //定义标识符常量
#define ADD(x, y) ((x)+(y)) //定义宏
区别:
本质不同:
typedef
是用来定义一种类型的新别名的,它不同于宏(#define),不是简单的字符串替换。它的新名字具有一定的封装性,所以新命名的标识符具有更易定义变量的功能,它是语言编译过程的一部分,但它并不实际分配内存空间。
#define
只是简单的字符串替换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。因此,它不会做正确性检查,不管含义是否正确它照样会带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。
作用域不同:
typedef遵循范围规则。即在范围内(函数内)定义了新类型,则只有范围存在时才会显示新类型名称。但是当预处理器遇#define时,它将替换所有出现的事件(之后没有范围规则)。
修饰指针类型作用不同:
例如:
Typedef int * p;
#define P int *
Const p i;//i不可更改,p指向的内容可以更改,相当于 int * const p;
Const P i;//i可以更改,p指向的内容不能更改,相当于 const int *p;或 int
注意:创建新的类型名应该使用typedef而不是#define,因为后者无法正确处理指针类型
例如:
#define d_ptr_to_char char*
d_ptr_to_char a,b;
正确地声明了a,但是b却被声明为一个字符。
而typedef却可以完全正确的声明
typedef char* d_ptr_to_char
d_ptr_to_char a,b;