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. IPFS

    http://www.r9it.com/20190412/ipfs-private-net.html IPFS指令集中文版(一) https://www.jianshu.com/p/ce74b32d2 ...

  2. Python之数据结构:序列

    一.序列 1.列表.元组和字符串都是序列 二.序列的两个特点:索引操作符和切片操作符 1.索引操作符:从序列中抓取一个特定项目 下标操作:使用索引获取序列中的单个项目: eg:shoplist[0] ...

  3. 关于python的整形(int)自动转长整形(long)的问题

    有时需要访问某个接口,其中传入的整形参数可能比较长就会变成long,这时如果用str()的话‘L’就会被转化到字符串中,导致接口不能识别: 这种情况下应该优先使用json来转译,可以完美保持翻译pyt ...

  4. 【09】react 之 表单组件

    不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...

  5. EclEmma Java Code Coverage for Eclipse

      1. 1EclEmma的介绍 一.EclEmma 简介: EclEmma是一个开源的软件测试工具(for eclipse),可以在编码过程中查看代码调用情况.也可以检测单覆盖率. 详见: http ...

  6. 【Docker】win10环境下安装Docker

    一.进入Docker官网 首先先到Docker官网下载最新官方Docker for Windows:Docker下载 在官网内可以查看到Docker的开发文档. 根据官网提示,Windows环境下下载 ...

  7. FOJ Problem 2273 Triangles

    Problem 2273 Triangles Accept: 201    Submit: 661Time Limit: 1000 mSec    Memory Limit : 262144 KB P ...

  8. kernel thread vs user thread

    The most important difference is they use different memory, the kernel mode thread can access any ke ...

  9. WebStorm使用JetBrains IDE Support调试

    1.安装WebStorm 2.安装谷歌的chome浏览器,并切换到开发者模式 3.下载并安装 JetBrains IDE Support(将2.0.7_0.crx文件直接拖到谷歌浏览器中就会自动安装) ...

  10. C++中的explicit关键字(转)

    按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: #pragma once class CExample { public: CExample(void); CExample(); ...