typedef 与 define 的区别
1、区别
(1)定义、执行时间、作用域
定义、执行时间:
#define pchar char *
typedef char *pchar;
定义的格式差别,显而易见的,要注意,define 是不能存在分号的(文本替换),而typedef 是存在逗号的(类型的重命名)。
同时,define 由预处理器进行处理,只做简单的文本替换的工作,不做任何检查(正确性检查、作用域检查、类型检查)
typedef 是给一个已经存在类型的别名,在编译时候处理。
作用域:
define 只要一次定义,那么就 没有作用域的限制,在哪都可以被使用:
void func1()
{
#define HW "HelloWorld";
} void func2()
{
string str = HW;
cout << str << endl;
}
typedef 则不然,存在自己的作用域。
void func1()
{
typedef unsigned int UINT;
} void func2()
{
UINT uValue = ;//error C2065: 'UINT' : undeclared identifier
}
(2)对指针的操作
#define pint int*
typedef int* ppint;
pint a1, b1;
ppint c1, d1;
上面的定义等价于
int * a1;
int b1;
int * c1;
int * d1;
对于处于定义指针的方式来说,还是使用 typedef 靠谱。
2、typedef 与 const 的结合
当:
typedef int * pint;
int a = ;
const pint p1 = &a;
*p1 = ;
cout << *p1 << endl;
打印的结果是: 2
可见: const pint p1; 是相当于 int * const p1,也就是 p1 是const 指针,p1 指向地址是常量(不能改变),所以定义的时候就需要被初始化,但是p1 所知的内容是可以被修改的,修改变为 2 打印输出。
可见,即使是换了顺序,都是相当于: int * const p1; 也就是不论顺序是怎么挑换都是一个定义 const 指针。
typedef int * pint;
int a = ;
pint const p1 = &a;
*p1 = ;
cout << *p1 << endl;
打印:
如果非要定义出一个 const int * 类型的话,只能:
typedef const int * cpint;
只有这个方法定义出来的才是,才可以定义出一个指向 const 的指针。
3、typedef 作用
(1)简化复杂的类型说明
int(*pfunc)(int,int)
使用typedef:
typedef int(*pfunc)(int,int)
使用:
pfunc ptr = 函数名;
(2)定义与平台无关的类型
数据类型的定义,一般都是与平台有关的。对于大型的代码的时候,如果定义的都是:long double a; 但是当平台不支持 long long 类型的时候,要进入代码体一个个查找,那真是要命:
typedef long double REAL;
在跨平台的时候,只需要修改一次就全部解决了。
4、封装程度不一样
typedef 和 define 封装程度是是不一样的。typedef 可以看成是一种彻底的“封装” 类型,也就是说,在对 typedef 声明之后,就不能再往里面添加别的东西了。而 define 则不然,他只是文本替换工作而已,所以声明之后还是可以进行封装的。
#define zhengxing1 int
unsigned zhengxing1 i;
编译器正确通过。
typedef int zhengxing2;
unsigned zhengxing2 j;
编译器是编译不过的。
typedef 与 define 的区别的更多相关文章
- typedef 和 #define 的区别
本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...
- typedef与#define的区别
1. typedef typedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类 ...
- typedef 和define的区别
总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...
- typedef 与define 的区别
typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译 ...
- typedef和#define的区别
转自:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html 一.typedef的用法在C/C++语言中,typedef常用 ...
- typedef 与 #define的区别
typedef 与 #define的区别 整理于一篇经典blog,经典原文地址http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.ht ...
- C++中typedef和define的区别
typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...
- C++ 系列:typedef 和 #define 的区别
总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...
- C语言中的typedef跟define的区别
今天用C语言练习时涉及到了typedef和define的使用问题,那么他们的区别是啥?这种情况下为什么要用typedef?哪种情况下为什么要用define呢? 学习C的时候的你是否考虑过这个问题呢? ...
随机推荐
- BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集
好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个 ...
- POJ2152 Fire 【树形dp】
题目链接 POJ2152 题解 经典老题,还真暴力 \(n \le 1000\),所以可以\(O(n^2)\)做 所以可以枚举每个点依附于哪一个点 设\(f[u]\)表示以\(u\)为根的子树的最小代 ...
- iOS指向函数的指针和block
一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志 好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作 ...
- 配置ubuntu16.04下Theano使用GPU运行程序的环境
ubuntu16.04默认安装了python2.7和python3.5 .本教程使用python3.5 第一步:将ubuntu16.04默认的python2修改成默认使用python3 . sudo ...
- Docker:架构分解
17分钟快速浏览一遍 Docker内部构建 要理解Docker内部构建,需要理解以下三种部件: Docker镜像(Image) Docker容器(Container) Docker仓库(reposit ...
- 51Nod 1001 数组中和等于K的数对 And 1015 水仙花数
1001 数组中和等于K的数对 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K ...
- 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表
在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...
- IE/FF/Chrome下document.documentElement和document.body的 scrollHeight/scrollTop/clientHeight 以及判断滚动条是否已拉到页面最底部
DTD已声明 IE document.documentElement.scrollHeight 浏览器所有内容高度 ,document.body.scrollHeight 浏览器所有内容高度 docu ...
- 通用mapper的框架
这两个框架都是一个大神写的.用来做单表的增删改查,爽爽的. 但是复杂的查询还不知道如何用,所以我还按传统的方式 写 service maperr ,写SQL来处理复杂查询,与多表的查询. 它的复杂查 ...
- ES6十大特性
本文主要针对ES6做一个简要介绍. 主要译自: http://webapplog.com/ES6/comment-page-1/.也许你还不知道ES6是什么, 实际上, 它是一种新的javascri ...