typedef 与#define的区别
来源:互联网 发布:宋太宗997 知乎 编辑:程序博客网 时间:2024/04/29 19:20
1.1 简化复杂的类型声明
简化复杂的类型声明,或给已有类型起一含义明确的别名;如:
typedef bool (*FuncPointer)(int, double);//声明了一个返回 bool 类型并带有两个(int和double)形参的函数的指针类型FuncPointer
FuncPointer pFunc;//声明了一个FuncPointer类型的函数指针对象pFunc
1.2 定义与平台无关的类型
定义与平台无关的类型,屏蔽不同平台的类型差异化;如:
用typedef来定义与平台无关的类型。
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。
1.3 与struct的结合使用
在C++中,struct与class的作用相同,就是默认的访问权限不同,struct默认为public,而class默认为private的。
【例1.3.1】:
定义一个Struct的类型Person,定义一个Person的对象person。
或者
定义一个Struct的类型Person,在定义的同时还声明了一个Person的对象person。
但是在C语言中,struct的定义和声明要用typedef。
【例1.3.2】:
如果没有typedef就必须用struct Person person;来声明,如:
【例1.3.3】
或
2. typedef与#define的区别
2.1. 执行时间不同
关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
【例2.1.1】typedef会做相应的类型检查:
【例2.1.2】#define不做类型检查:
程序的输出结果是: 36,根本原因就在于#define只是简单的字符串替换。
2.2. 功能有差异
typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。
#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
2.3. 作用域不同
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。
【例2.3.1】没有作用域的限制,只要是之前预定义过就可以
【例2.3.2】而typedef有自己的作用域
【例2.3.3】
上面例子在B类中使用UINT会出错,因为UINT只在类A的作用域中。此外,在类中用typedef定义的类型别名还具有相应的访问权限,【例2.3.4】:
而给UINT加上public访问权限后,则可编译通过。
【例2.3.5】:
2.4. 对指针的操作
二者修饰指针类型时,作用不同。
结果:
p1:00EFD094 *p1:1
p1:00EFD094 *p1:5
p2:00EFD098 *p2:2
p2:00EFD094 *p2:5
参考和引用文章:
《关于typedef的用法总结》
《Typedef和define的区别》
- typedef与#define的区别
- #typedef与#define的区别
- typedef与define的区别
- typedef与#define 的区别
- typedef与#define 的区别
- typedef与#define 的区别
- typedef与#define的区别
- #define与 typedef的区别
- typedef与define的区别
- typedef与define的区别
- #define 与 typedef 的区别
- typedef与#define的区别
- typedef 与 #define的区别
- typedef 与#define的区别
- #define与typedef的区别
- typedef 与 #define的区别
- define与typedef的区别
- typedef 与define 的区别
- BLE-NRF51822教程1-常用概念
- java 异常
- java.lang.RuntimeException:Unable to start activity ComponentInfo{com.meizu.beautify/com.my.viewc.Ma
- 商品的页面
- WKWebView VS UIWebView
- typedef 与#define的区别
- Centos7 Java配置
- nginx做负载均衡的常用配置
- 生成唯一序列号 Unique ID
- C语言总结(一)
- 配置jdk和tomcat
- 初探设计模式1
- 欢迎使用CSDN-markdown编辑器
- 改变数据库表的显示文本