一、typedef的用法
typedef常用来为某一类型自定义名称和复杂的类型命名,它是语言编译的一部分,它的定义的作用域取决于它定义所在的位置,如果定义在函数中,就具有局部作用域,受限于所在的函数;定义在函数外就具有文件作用域,注意结尾有“;”。
举例:
typedef unsigned char uchar;
uchar y[10];
这里uchar相当于unsigned char,定义了一个指向unsigned char型的有10个元素的数组。
二、#define的用法
#define是一宏定义语句,通常用来定义常量,它在预处理阶段完成。每行#define都由三部分组成,第一部分是#define其自身;第二部分是选定的缩写,或称为宏;第三部分为替换体,在预处理时用替换体代替宏。注意结尾无“;”。例如:
#include <stdio.h>
#define TWO 2
int main()
{
int x = TWO;
printf("x = %d\n",x);
return 0;
}
在程序预处理时,预处理器在程序中找到了对应的宏TWO,于是用2代替了TWO,int x = TWO变成了int x = 2。
三、typedef与#define的区别
typedef只是为了增强可读性从而给类型起别名,而#define在C中本是为了定义常量,但目前也常看到它用来作为起别名的工具。这也使得有的人对它们的概念慢慢混淆。
typedef和#define的区别在于:
① typedef创建的符号名只受限于类型,不能用于值。如typedef TWO 2在对程序编译时会出现报错。
② typedef在编译时处理,而#define是预处理命令,在预处理阶段处理。
③ define只进行简单的替换,而typedef不是简单的替换,其别名有一定的封装性。看下面的例子:
typedef INT1 (int *) ;
#define INT2 (int *);
对于上面的两句语句,“INT1 a,b;”和“INT2 a,b;”的效果相同吗?实则不是。
INT1 a,b中等效于int * a和int * b两个整型指针变量,而对于INT2 a,b则为int * a和int b,只有前一个为整型指针类型,这也说明了简单替换的说法。