typedef语句typedef语句typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。在编程中使用typedef目的一般有两个,一:给变量一个易记且意义明确的新名字,二:简化一些比较复杂的类型声明。typedef的最简单使用语法形式typedef已有类型名新类型名表;例如typedeflongbyte_4;给已知数据类型long起个新名字,叫byte_4。Byte_4i1,i2;等价于longi1,i2;typedef与结构结合使用typedefstructtagMyStruct{intiNum;longlLength;}MyStruct;这语句实际上完成两个操作:1)定义一个新的结构类型structtagMyStruct{intiNum;longlLength;};不论是否有typedef,这个结构都存在。2)typedef为这个新的结构起了一个名字,叫MyStruct。typedefstructtagMyStructMyStruct;因此,MyStruct实际上相当于structtagMyStruct,我们可以使用MyStructvarName来定义变量。应用举例typedefstructtagNode{char*pItem;pNodepNext;//错误,pNode没定义}*pNode;pNode是指向structtagNode类型的指针类型。pNodep;structtagNodes;P=&s;修改:一、typedefstructtagNode{char*pItem;structtagNode*pNext;}*pNode;二、typedefstructtagNode*pNode;structtagNode{char*pItem;pNodepNext;};注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。代码简化为复杂的声明定义一个新的简单的别名typedefint(*PF)(constchar*,constchar*);这个声明引入了PF类型作为函数指针的同义字,该函数有两个constchar*类型的参数以及一个int类型的返回值。PFptr;ptr是指向函数的指针。PFRegister(PFpf);Register()的参数是一个PF类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同int(*Register(int(*pf)(constchar*,constchar*)))(constchar*,constchar*);等价于:理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:int(*func)(int*p);首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。int(*func[5])(int*);func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。预处理指令源程序源程序预处理器预处理器词法分析词法分析语法分析语法分析代码生成代码生成错误处理程序错误处理程序目标程序目标程序符号表符号表错误信息错误信息1.预处理器改善程序的组织和管理2.预处理指令所有编译指令以#开头,每条指令单独占一行宏定义指令用指定正文替换程序中出现的标识符形式#define标识符文本多用const代替#define#define的一个有效应用是在条件编译指令中,避免程序中多次用include指令包含这个头文件,出现重定义的错误文件包含include指令在编译之前把指定文件包含到该命令所在位置#include<文件名>或#include"文件名"形式为:系统头文件文件包含include指令在编译之前把指定文件包含到该命令所在位置#include<文件名>或#include"文件名"形式为:自定义头文件条件编译形式1#if常量表达式程序段#endif形式2#if常量表达式程序段1#else程序段2#endif形式3#if常量表达式1程序段1#elif常量表达式2程序段2…#elif常量表达式n程序段n#else程序段n+1#endif条件编译的应用一、例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。可以用以下的条件编译:#ifdefWINDOWS...