typedef与#define解析!

typedef与#define解析!

一、typedef

在C和C++程式语言中,typedef是一个关键字,它用来对一个资料类型取一个别名,目的是为了使原始码更易于阅读和理解。其通常用于简化宣告复杂的类型组成的结构,但它也常常在各种长度的整数资料型别中看到,如size_t和time_t。

资料类型:在程式设计的型别系统中,数据类型(Data Type),又称资料型态、资料型别,是用来约束数据的解释。资料类型描述了数值的表示法、解释和结构,并以演算法操作,或是物件在记忆体中的存储区,或是其他储存装置。
————引自维基百科

typedef的用法:
1、为基本数据类型定义新的类型名,取个别名。
系统默认的所有基本类型都可以利用 typedef 关键字来重新定义类型名,示例代码如下所示:
而且,我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型,即:typedef long double REAL;在不支持 long double 的平台二上,改为:
typedef double REAL;甚至还可以在连 double 都不支持的平台三上,改为:typedef float REAL;
这样,当跨平台移植程序时,我们只需要修改一下 typedef 的定义即可,而不用对其他源代码做任何修改。

2、为自定义数据类型(结构体、共用体和枚举类型)定义简洁、易读的类型名称
例如,对于结构体定义别名,简单易读。

typedef struct tagTest
{
	int x;
	double y;
}Test;

3、为复杂的声明定义一个新的简单的别名。
在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。

需要注意的是,typedef本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。

二、#define

在这里插入图片描述
#define是作为宏定义,其分为无参和带参形式。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
#define定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。

预编译:又叫预处理。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。

通过#define宏定义,方便了程序的修改,使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 我们可以用较短的有意义的标识符来写程序,这样更方便一些。同时也提高程序的运行效率,使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率。
在这里插入图片描述
在这里插入图片描述

宏与函数
宏常被用来完成相对简单的运算,原因:
1、用于调用调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。
2、更重要的是,函数的参数必须声明为特定的类型,所以函数只能在类型合适的表达式上使用。反之宏可以适用于整形、长整形、浮点型等可以用来比较的类型。宏是类型无关的。
在这里插入图片描述
在这里插入图片描述

三、typedef 对比 #define

1、原理
#define是C语言中定义的语法,作为预处理指令,在预处理时进行简单的宏展开或者说字符串替换,而不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。
typedef是关键字,其在编译时处理,有类型检查功能,提高了程序的安全性。它只是在自己的作用域内给一个已经存在的类型取了一个别名。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。

2、作用域
宏定义的作用范围仅限于当前文件,即file1.c中定义 #define PI 3.14,在file2.c中该宏定义不起作用;而通过将#define PI 3.14定义在common.h中,然后file1.c和file2.c分别#include "common.h"的方式,该宏定义在file1.c和file2.c中都起作用。而typedef有着自己的作用域。

3、功能不同
#define既可以为类型取别名,还可以定义常量、变量、编译开关等等。
而typedef用来定义类型的别名。另一个功能是定义机器无关的类型。

4、对指针的操作不同

#define datatype1 int*
typedef int* datatype2;
datatype1  a, b;
datatype2  c, d;

上述代码含义分别为,
声明一个指针变量a和一个整型变量b
声明两个指针变量c、d

5、各有所长
#define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。
而typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值