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 = &amp;a;
*p1 = ;
cout &lt;&lt; *p1 &lt;&lt; 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 = &amp;a;
*p1 = ;
cout &lt;&lt; *p1 &lt;&lt; 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 的区别的更多相关文章

  1. typedef 和 #define 的区别

    本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...

  2. typedef与#define的区别

    1.  typedef typedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类 ...

  3. typedef 和define的区别

    总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...

  4. typedef 与define 的区别

    typedef和#define的用法与区别   typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译 ...

  5. typedef和#define的区别

    转自:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html 一.typedef的用法在C/C++语言中,typedef常用 ...

  6. typedef 与 #define的区别

    typedef 与 #define的区别 整理于一篇经典blog,经典原文地址http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.ht ...

  7. C++中typedef和define的区别

    typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...

  8. C++ 系列:typedef 和 #define 的区别

    总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...

  9. C语言中的typedef跟define的区别

    今天用C语言练习时涉及到了typedef和define的使用问题,那么他们的区别是啥?这种情况下为什么要用typedef?哪种情况下为什么要用define呢? 学习C的时候的你是否考虑过这个问题呢? ...

随机推荐

  1. [CQOI2015][bzoj3930] 选数 [杜教筛+莫比乌斯反演]

    题面: 传送门 思路: 首先我们把区间缩小到$\left[\lfloor\frac{L-1}{K}\rfloor,\lfloor\frac{R}{K}\rfloor\right]$ 这道题的最特殊的点 ...

  2. cf 843 B Interactive LowerBound [随机化]

    题面: 传送门 思路: 这是一道交互题 比赛的时候我看到了直接跳过了...... 后来后面的题目卡住了就回来看这道题,发现其实比较水 实际上,从整个序列里面随机选1000个数出来询问,然后从里面找出比 ...

  3. hdu 3721 树的直径

    思路:枚举+树的直径 #include<iostream> #include<cstring> #include<cstdio> #include<algor ...

  4. HDR 高动态范围图像

    以下来源于百度百科: 高动态范围图像(High-Dynamic Range,简称HDR),相比普通的图像,可以提供更多的动态范围和图像细节,根据不同的曝光时间的LDR(Low-Dynamic Rang ...

  5. 如何在vue里实现同步阻塞请求,请求完成之前不加载页面或组件?

    https://segmentfault.com/q/1010000013787292 答案: getUserInfo函数数据请求下来,设置开关flag=true,页面最外层box v-if=&quo ...

  6. 如何清除全部的NSUserDefaults储存的数据。

    今天做项目遇到,如何清除全部的NSUserDefaults储存的数据. 方法1:找到所有的key然后remove掉 代码: [objc] view plain copy /** * 清除所有的存储本地 ...

  7. ofbiz16 idea 启动

    1.下载gradle并安装到本地 2.idea引入gradle 3.gradle右键选择refresh,项目会重新编译并加载gradle的task 4.可以再编译一下 5.没问题的话打开,jar ap ...

  8. 利用$.getJSON() 跨域请求操作

    原文发布时间为:2011-01-14 -- 来源于本人的百度文章 [由搬家工具导入] $.get 没有权限? $.post 没有权限? 因为他们都不能跨域,那就用 $.getJSON() 吧 利用$. ...

  9. MySQL的配置文件无法修改的解决办法(Win8)

    问题描述      修改mysql5.7安装目录下my-default.ini发现不起作用: MySQL的版本是5.7,操作系统是window8.1.MySQL安装在 C:\Program Files ...

  10. Python 函数的一般形式及参数

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/01 21:46 # @Author : lijunjiang # @Fi ...