在C/C++语言中,typedef
作用是为一种数据类型定义一个新名字。它是语言编译过程的一部分,但它并不实际分配内存空间,
这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef
目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
应注意用宏定义表示数据类型和用 typedef 定义数据说明符的区别。
宏定义只是简单的字符串代换,是在预处理完成的,
而 typedef 是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
请看下面的例子:
#define PIN1 int *
typedef (int *) PIN2;
从形式上看这两者相似, 但在实际使用中却不相同。
下面用 PIN1,PIN2 说明变量时就可以看出它们的区别:
PIN1 a,b;
在宏代换后变成:
int *a,b;
表示 a 是指向整型的指针变量,而 b 是整型变量。然而:
PIN2 a,b;
表示 a、b 都是指向整型的指针变量。因为 PIN2 是一个类型说明符。由这个例子可见,
宏定义虽然也可表示数据类型, 但毕竟是作字符代换。在使用时要分外小心,以避出错。
定义一个结构体
struct STU
{
int age;
struct STU *next;
};
然后我想定义一个结构体类型的指针,应该是struct STU *p;
或者定义一个普通的结构体变量struct STU a;
比较麻烦,用typedef
后
typedef struct STU
{
int age;
struct STU *next;
}linklist;
那么现在linklist
就代表这个结构体,现在定义结果提指针linklist *p
;
就方便了,同样,把他定义成
typedef struct STU
{
int age;
struct STU *next;
}*linklist;
那么linklist
就是代表这个结构体指针类型,linklist head
;head
就是结构体指针类型了;
总结一下 typedef
就是为了方便代码编写,提高编写效率的,在预处理阶段会进行替换的。
下面介绍一下预处理
C/C++程序编译流程:预处理->编译->汇编->链接。
预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序。
C/C++提供的预处理指令主要有
文件包含(include)、
宏定义(macro)、
条件编译等。
而编译器编译程序的步骤
主要有四个——预处理、编译、汇编和链接,最后得到可执行的目标文件。
C/C++预处理器什么都不会做,只是做宏替换和文本替换。
C/C++预处理是不会做任何语法检查的,不仅是因为它不具备语法检查功能,也因为预处理命令
不属于C/C++语句(这也是定义宏时不要加分号的原因),语法检查是编译器要做的事情。
通过预处理之后,我们得到的是也仅仅是真正的源代码。
还有就是,GCC这个东西确实很强大。如果是用VC这种IDE,恐怕就不能看到,预处理原来是这么个好玩的东西了。