众所周知,typedef与#define都可以将系统关键字定义为一个其他名字来使用,方便我们记忆,比如 #define PCHAR char* 与 typedef char* PCHAR;,两种方式定义出来的PCHAR都可以用来定义新的变量。但本质绝非那么简单。
#define自定义的名字我们成为“宏”,而typedef自定义的名字我们称为真正的别名。宏是在预编译期间的一个简单的替换操作,而typedef则并非是简单的替换。通过一个例子我们就可以清晰的发现两者的区别。 一段既有#define也有typedef的代码:
代码语言:javascript复制#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 ““
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*类型的指针。