typedef和#define的区别

1.typedef

typedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类型的别名。typedef的作用主要有两点:

1.1  简化复杂的类型声明

简化复杂的类型声明,或给已有类型起一含义明确的别名;如:

typedef bool (*FuncPointer)(int, double); //声明了一个返回 bool 类型并带有两个(int和double)形参的函数的指针类型FuncPointer

FuncPointer pFunc; //声明了一个FuncPointer类型的函数指针对象pFunc

1.2  定义与平台无关的类型

定义与平台无关的类型,屏蔽不同平台的类型差异化;如:

用typedef来定义与平台无关的类型。

比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

typedef long double REAL;

在不支持 long double 的平台二上,改为:

typedef double REAL;

在连 double 都不支持的平台三上,改为:

扫描二维码关注公众号,回复: 2393067 查看本文章

typedef float REAL;

也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。

标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。

1.3  与struct的结合使用

在C++中,struct与class的作用相同,就是默认的访问权限不同,struct默认为public,而class默认为private的。struct的定义和声明要用typedef。

typedef struct __Person
{
	string name;
	int age;
	float height;
}Person;      //这Person是结构体的一个别名
Person persion;

 2.1typedef与#define的区别

关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。

#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

 typedef会做相应的类型检测:

 

  #define不做类型检测

#define f(x) x*x
void func()
{
	int a = 6, b = 2, c;
	c = f(a) / f(b);
	printf("%d\n",c);
}

 

 2.2 功能有差异

 typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。

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

2.3作用域不同

 #define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。

 而typedef有自己的作用域。

2.4对指针的操作

二者修饰指针类型时,作用不同。

typedef int *pint;
#define PINT int *

int a = 1, b = 2;
const pint p1 = &a;   //p不可更改,p指向的内容可以更改,相当于 int * const p;
const PINT p2 = &b;   //p可以更改,p指向的内容相当于const int *p 或 int const *p

pint s1, s2;          //s1和s2都是int型指针
PINT s3, s4;          //相当于int *s3,s4 只有一个是指针

转自:https://blog.csdn.net/luoweifu/article/details/41630195

猜你喜欢

转载自blog.csdn.net/m0_37806112/article/details/81190417