typedef与define的用法及区别

关键字 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:定义一个标识符来表示一个常量。

  1. #define又称宏定义,标识符为所定义的宏名,简称宏。其功能是将标识符定义为其后的常量。
  2. 特点是:

定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。

在这里呢,顺便一提预编译:预编译又叫预处理。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。

  1. 一般形式为:

#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;

发布了50 篇原创文章 · 获赞 19 · 访问量 4747

猜你喜欢

转载自blog.csdn.net/qq_44723296/article/details/96480941