#define:明示常量(符号常量)
结构
#define 宏 替换体
宏的名称不允许有空格,只能使用字符、数字和下划线,首字符不能是数字
#include <stdio.h>
#define TWO 2
#define WOW "zhejuhua haochang a \
zhende haochang zhende ." //反斜杠把该定义延续到下一行
#define FOUR TWO*TWO
#define PX printf("X is %d.\n",x)
#define FMT "X is %d.\n"
int main()
{
int x=TWO;
PX;
x=FOUR;
printf(FMT,x);
printf("%s\n",WOW);
return 0;
}
typedef:类型定义
c语言提供了typedef用来为某个已存在的类型增加一个新的名称;
换另外一种说法就是:为已存在的类型命名(定义)一个标识符;
与#define的不同
(1)typedef创建的符号名只受限于类型,不能用于值。
(2)typedef由编译器解释,不是预处理器。
(3)在其受限范围内,typedef比#define更灵活。
与#define重合的功能
#define BYTE unsighed char
typedef unsigned cahr BYTE;
typedef用法
typedef int Length; //将Length定义为与int具有相等意义的名字。
//类型Length可以用于类型声明、类型转换等,
//它和类型int完全相同。
typedef char *String; //将string定义为与char *(字符指针)同义
//定义的新名称以大写字母开头。
Length len,maxlen; //相当于int len,maxlen;
Length *lengthes[]; //int *lengthes[];
类似地
typedef long Bolckno,*Blockptr;
typedef struct { double x,y; } Point;
Blockno b; //b的类型为long。
extern Blockptr bp; //bp的类型为“指向long类型的指针”。
Point z = {3.0,6.0}; //z的类型为指定结构类型
//编译器会解释为struct {double x,y;} z={3.0,6.0};
Point *zp; //zp的类型为指向该结构的指针。
//定义二叉树节点结构
typedef struct tnode *Treeptr;
typedef struct tnode{
char *word;
int count;
Treeptr left; //左子树,相当于struct tnode *left;
Treeptr right; //右子树,相当于struct tnode *right;
}Treenode;
//创建了两个新类型关键字:Treenode(一个结构)和Treeptr(一个指向Treenode的指针)。
typedef类似于#define语句,但是由于typedef是由编译器解释的,因此它的文本替换功能要超过预处理器的能力,例如:
typedef int (*PFI)(char *,char *); //该语句定义了类型PFI是“一个指向函数的指针,
//该函数具有两个char *类型的参数,
//返回的值类型为int”。
PFI strcmp,numcmp;
typedef的优点
(1)使表达方式简洁
(2)提高程序的可移植性:typedef声明的数据类型同机器有关,那么当程序移植到其他机器上时,只需要改变typedef类型定义就可。对于移植到各种不同大小的整型值机器上来说,只需要选择合适的short、int、long类型大小即可。
(3)为程序提供更好的说明性。