typedef与#define区别

1650阅读 0评论2020-06-12 hiyachen
分类:C/C++

typedef和define都是替一个对象取一个别名,以此增强程序的可读性,区别如下:

(1)原理不同
#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。
例如: 
#define PI 3.1415926 
程序中的:area=PI*r*r 会简单替换为3.1415926*r*r 
注意是不做正确性检查的,对与PI没有类型。

typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。
例如:typedef uint64_t  u64
程序中typedef u64 async_cookie_t; 为64位无符号整数

(2)功能不同
typedef用来定义类型的别名。
a)简短易于记忆。
b)定义与机器无关的类型,屏蔽不同平台的类型差异化。
如,定义一个叫 REAL 的浮点类型:
在目标平台一,表示最高精度的类型为:typedef long double REAL;
在不支持 long double 的平台二上,改为:typedef double REAL;
在连 double 都不支持的平台三上,改为:typedef float REAL;
即跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。
typedef是定义一种类型的新别名,不是简单的字符串替换。

#define用于宏定义,不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

(3)作用域不同
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。

(4)对指针的操作不同
#define INTPTR1 int*
typedef int* INTPTR2;
INTPTR1 p1, p2;  
简单替换为 int* p1,p2; 即声明一个指针变量p1、一个整型变量p2
INTPTR2 p3, p4; 
含义是int *p3; int *p4;(注意两个分号),声明两个指针变量p3、p4

#define INTPTR1 int*
typedef int* INTPTR2;
int a = 1;
int b = 2;
int c = 3;
const INTPTR1 p1 = &a;
const INTPTR2 p2 = &b;
INTPTR2 const p3 = &c;
说明:
const INTPTR1 p1; // p1是一个常量指针,p1可更改(指向可以发生变化),但是p1指向的内容不可更改。
const INTPTR2 p2;//p2是一个指针常量,p2不可更改,但p2指向的内容可更改。不可使p2再指向其他内容。因为INTPTR2表示一个指针类型,因此用const限定,表示封锁了这个指针类型。
INTPTR2 const p3是一个指针常量

上一篇:GlusterFS Libgfapi接口与FUSE
下一篇:poll()函数的使用