define和typedef的理解

1、define是预处理指令,在编译预处理时进行简单的代码替换,不做类型的正确性检查,只有编译已被展开的情况下才有可能发现错误。但没有错误并不代表是按照我们的预期去运行的。说明如下:

#define PI 3.145926

area=PI*r*r 会替换为3.1415926*r*r
如果你把#define语句中的数字9 写成字母g 预处理也照样带入。当然这样在编译被展开的时候回发现错误
#define  P struct s*

如果程序中有如下定义时,P p1,p2;

那么把代码替换之后为struct s*p1,p2;这里p1是个结构体指针,p2是个实际的结构体,这可能不是我们想要的结果,但语法是没错的

综上在使用的宏定义时,如果不注意就容易出现错误

2、typedef

typedef本身也是一种和auto、static、register、volatile一样的存储类型的关键字,主要是用来实现定义一种新的类型,使得代码变得易于阅读,相比与define,typedf不但实现了define的功能,而且是编译时处理的,因此它有自动检查的功能,主要功能有四个,说明如下:

1)、定义一种类型的别名

typedef  struct s* P; //定义一种新的结构体类型struct s*,用P来表示,一般别名用大写表示

P p1,p2; //声明了两个结构体指针p1,p2(需要注意不能直接写成 struct s* p1,p2,但用typedf定义之后就可以直接写)

2)、在c语言中和struct结合使用,简化程序

typedef struct Students{

int score;

}STU;

这样定义之后就可以在声明新的结构体对象的时候直接使用STU stu1,stu2;

但如果不使用typedef,那么在新定义对象时,就必须写成struct Students stu1,stu2;

还需要注意的是在c++中可以不使用typedef就可以实现这种快捷的写法,即在c++中可以直接写Students stu1,stu2;

3)、用typedef来定义与平台无关的类型

比如定义一种NEWFLOAT的浮点类型时,在目标平台上如果支持,可以实现最高精度

typedf long double NEWFLOAT

在不支持long double的平台上,可以修改为

typedef double NEWFLOAT

如果连double都不支持,那么修改为

typedef float NEWFLOAT

因此在跨平台时,只需要修改这里的定义就可以,而不用修改其他源码。标准库广泛使用这个原理,例如ssize_t

4)、当一种类型很复杂时,写起来很不方便,那可可以使用typedef给它起个别名,这样方便易读

int  *(*a[7])(char,char)

typedef int (*pFunction)(char,char) 

这样从新定义这种类型之后,声明这种类型的变量的方式为

pFunction a[7];

分析方法为先从看变量名a开始看,然后先右后左,碰到圆括号跳出,括号内分析完跳出括号然后继续往后,规则是一样。上面的例子可以解释为:首先从变量a开始,向右是[],[]的优先级高于*所以首先是个有7个元素的数组,左边是个指针,因此元素的某种类型的指针。碰到圆括号跳出,后面是个圆括号,里面有两个char类型的参数,所以数组里指针的类型为函数指针,这种指针指向的函数类型是输入参数是两个char型参数,返回值是个int *的函数。

或者从最基本的定义入手,返回值,输入参数。首先可以看出是个函数,函数肯定有输入和返回值,函数的输入是两个char型参数,返回值是int *类型的指针,函数前面里的括号定义了一个指针数组,数组里的都是指针,因此可以理解为函数指针。所以定义了一组函数指针,指向的是返回值为int *,输入值为char类型的函数。


使用typedef需要注意的地方

1)、typedef也是一种存储类型的关键字,因此一个表达式中,不能出现多个存储类型的关键字

typedef static int INT; //错误的写法

2)、//网上的

typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如: 
先定义: 
typedef   char*   PSTR; 
然后: 
int   mystrcmp(const   PSTR,   const   PSTR); 

const   PSTR
实际上相当于const   char*吗?不是的,它实际上相当于char*   const 
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char*   const 
简单来说,记住当consttypedef一起出现时,typedef不会是简单的字符串替换就行。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值