typedef 与 #define 的重要区别

众所周知,typedef与#define都可以将系统关键字定义为一个其他名字来使用,方便我们记忆,比如 #define PCHAR char* 与 typedef char* PCHAR;,两种方式定义出来的PCHAR都可以用来定义新的变量。但本质绝非那么简单。

#define自定义的名字我们成为“宏”,而typedef自定义的名字我们称为真正的别名。宏是在预编译期间的一个简单的替换操作,而typedef则并非是简单的替换。通过一个例子我们就可以清晰的发现两者的区别。

一段既有#define也有typedef的代码:

#define DPCHAR char*
typedef char* TPCHAR;

int main(int argc, char* argv[])
{
	DPCHAR p1, p2;
	TPCHAR p3, p4;
	return 0;
}

在linux下我们使用 gcc -E 进行预编译后得到的文件如下:

# 1 "define.c"
# 1 "<built-in>"
# 1 "<命令行>"
# 1 "define.c"

typedef char* TPCHAR;

int main(int argc, char* argv[])
{
 char* p1, p2;
 TPCHAR p3, p4;
 return 0;
}

我们很明显可以看到,使用#define定义的宏常量在预编译阶段就已经将代码进行了替换,这样编译出来的程序,p1是一个指针,而p2则只是一个单纯的char类型变量而已。

但 typedef 定义的别名则不然,p3和p4均是一个char*类型的指针。

说说你的想法