typedef 和 #define 的区别:
1.#define
#define 是用来定义标识符常量,定义宏的。
语法: #define name stuff
①定义标识符常量
我们可以在代码中定义一些#define 的值,而当我们进行到预编译的时候,我们代码中的名字就会被替换。
比如:
#define MAX 100
int main()
{
int a = MAX;
printf("%d", a);
return 0;
}
经历了预处理的过程后,其实代码中会变成这样:
int main()
{
int a = 100;
printf("%d", a);
return 0;
}
而且#define定义的不止是一些数值,还可以定义一些标识符常量:
#define db double
int main()
{
db a = 5.5;
printf("%lf", a);
return 0;
}
还有很多例子:
#define do_forever for(;;)
#define CASE break;case
2.typedef
typedef 是在C和C++编程语言中一个关键字。它用来对一个资料类型起一个新名字。目的是为了使源代码更易于阅读和理解。
而typedef 在C语言中为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
比如:
typedef double db;
int main()
{
db a = 5.5;
printf("%lf", a);
return 0;
}
3.typedef 和 #define 的区别
-
#define 是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。 -
typedef 是在编译时才处理的。 -
一般来说#define 定义的宏是没有作用域限制的,只要在使用前有定义就可以使用。而typedef 定义的别名是有作用域的。
而关于这两者,有一个经典例题:
#define prt_t int *
typedef int* prt_t2;
int main()
{
prt_t p1, p2;
prt_t2 p3, p4;
return 0;
}
对于prt_t p1, p2; 来说,在预处理后会替换成int *p1,p2; ,也就是说替换后不难看出,p1是指针,p2是整形。而prt_t2 p3, p4; 中定义的p3和p4,都是指针类型。
所以对于#define 定义的宏定义只是简单的字符串代换(原地扩展),而typedef的新名字同样是一种类型,只是叫法不一样了。
|