本文已迁移至:

http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html

typedef 和#define 都常用来定义一个标识符及关键字的别名,但他们之间有关键的区别。

typedef 是语言编译过程的一部分;

#define是宏定义语句,它本身并不在编译过程中进行,而是在这之前的预处理过程就已经完成了。

要理解两者的关键区别,可以这么来考虑:

把typedef 看成是一种彻底的"封装"类型,相当于产生了一个新的变量类型(这点与struct 类似,待会会与struct 进行类比来增进理解)。而#define 仅仅是进行宏文本替换。

typedef 和 #define 的区别体现在两个方面:

首先, 可以用其他类型说明符对宏类型名进行扩展,但typedef 所定义的类型名却不能进行扩展。

如下:

#define peach int
unsigned peach i; //没问题,可以这么使用。 typedef int banana;
unsigned banana i; //错误,非法!

#define 仅仅是进行宏文本替换,它并没有产生新的变量类型。以上面代码为例,在预处理阶段, peach 重新被替换为 int, 故可在peach 前面加unsigned;

而typedef 的工作方式则和#define完全不一样,它相当于产生了一个新的变量类型,这个新的变量类型前面不能再进行扩展。这和struct 类型类似,定义了一个struct 也相当于产生了一个新的变量类型,而我们从不会见到类似于 unsigned struct student a; 这种声明。

第二个区别,在连续几个变量的声明中,用typedef 定义的类型能够保证声明中的所有变量均为同一种类型,而用#define 则无法保证。

如下:

#define intp int *
intp a, b; //经过宏扩展,第二行变为:
int * a, b; //a是一个指向int变量的指针变量, b是一个int型变量! typedef int * int_p;
int_p c, d; //c, d都是指向int变量的指针变量!

以上述代码为例,#define仅仅是进行宏替换,在预处理阶段intp被替换为 int *,这显然只能声明a是个指针变量, 而b是int型变量。typedef则相当于定义了一个新的变量类型,能对c、d都起作用。同样与struct作类比, 对于 struct student e,f; e和f都被声明是student类型的变量。

#---------------------------------------------------------------------------------#

参考文献

《C专家编程》, Peter Van Der Linden 著, 徐波 译

typedef 和 #define 的区别的更多相关文章

  1. typedef与#define的区别

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

  2. typedef 和define的区别

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

  3. typedef 与define 的区别

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

  4. typedef和#define的区别

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

  5. typedef 与 #define的区别

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

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

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

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

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

  8. typedef 与 define 的区别

    1.区别 (1)定义.执行时间.作用域 定义.执行时间: #define pchar char * typedef char *pchar; 定义的格式差别,显而易见的,要注意,define 是不能存 ...

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

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

随机推荐

  1. 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考

    事情是如何发生的 最近干了件事情,发现了 underscore 源码的一个 bug.这件事本身并没有什么可说的,但是过程值得我们深思,记录如下,各位看官仁者见仁智者见智. 平时有浏览园区首页文章的习惯 ...

  2. Opencv摄像头实时人脸识别

    Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...

  3. 微信小程序开发初体验

    微信小程序上线几天了,趁着周末补了一下JS,然后今天参照文档和教程写了个小demo 文档地址       教程地址 看文档就看了一点时间,因为以前没接触过JS框架,但是接触过PHP框架= = ,所以理 ...

  4. 《Kafka Stream》调研:一种轻量级流计算模式

    原文链接:https://yq.aliyun.com/articles/58382 摘要: 流计算,已经有Storm.Spark,Samza,包括最近新起的Flink,Kafka为什么再自己做一套流计 ...

  5. OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)

    在OpenCV2:图像的几何变换,平移.镜像.缩放.旋转(1)主要介绍了图像变换中的向前映射.向后映射.处理变换过程中浮点坐标像素值的插值算法,并且基于OpenCV2实现了两个简单的几何变换:平移和镜 ...

  6. HTML中嵌入pdf的简单方法

    <embed src="> 或者你不想显示某些功能的话: <embed src=">

  7. Xamarin android 之Activity详解

    序言: 上篇大概的讲解了新建一个android的流程.今天为大家带来的是Activity详解,因为自己在开发过程中就遇到 好几次坑,尴尬. 生命周期 和Java里头一样一样的,如图 图片来源于网上哈, ...

  8. java静态方法调用&&构造函数&&静态块

    静态方法,也就是使用static声明的方法,在虚拟机启动加载类的时候就进行了创建,所以使用到静态方法时,直接使用类名点静态方法即可调用.java在执行静态方法前,不会调用构造函数:构造函数是在实例化j ...

  9. 网站banner无缝轮播

    网站banner无缝轮播 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  10. 接入统计Crash的工具Crashlytics-ios

    1. 注册账户 登录网站 https://get.fabric.io/ 来注册新的账户 2. account confirmed之后就出现相应的设置页面,设置你的team的名称 3. 出现页面提示下载 ...