本文已迁移至:

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. 相克军_Oracle体系_随堂笔记003-体系概述

    1.进程结构图 对Oracle生产库来讲,服务器进程(可以简单理解是前台进程)的数量远远大于后台进程.因为一个用户进程对应了一个服务器进程. 而且后台进程一般出问题几率不大,所以学习重点也是服务器进程 ...

  2. 相克军_Oracle体系_随堂笔记011-事物

    数据库主要实现的功能无非是以下三点: ①数据的一致性, ②数据的安全, ③数据的优化.   事物主要影响数据的一致性. 1.事务的基本概念    一组DML语句    insert.delete.up ...

  3. Android之仿ele地图定位效果

    PS:最近项目要求,希望在选择地址的时候能够仿ele来实现定位效果.因此就去做了一下.不过ele使用高德地图实现的,我是用百度地图实现的.没办法,公司说用百度那就用百度的吧.个人觉得高德应该更加的精准 ...

  4. Scala比较器:Ordered与Ordering

    在项目中,我们常常会遇到排序(或比较)需求,比如:对一个Person类 case class Person(name: String, age: Int) { override def toStrin ...

  5. JsTree实现简单的CRUD

    现在需要将省市县区域这块搞成树状图的形状,由于项目使用的AngularJS+ABP+WebAPI各个模块之间数据传输形式是json格式,那么对于JsTree来说就方便很多了,只需要将json数据搞成我 ...

  6. Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署

    本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...

  7. ASP.Net MVC Action重定向跳出Controller和Area

    1.重定向方法简介 [HttpPost] public ActionResult StudentList( string StudName, string studName, DateTime Bir ...

  8. MySQL如何利用索引优化ORDER BY排序语句

    MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...

  9. EFCore执行Sql语句的方法:FromSql与ExecuteSqlCommand

    前言 在EFCore中执行Sql语句的方法为:FromSql与ExecuteSqlCommand:在EF6中的为SqlQuery与ExecuteSqlCommand,而FromSql和SqlQuery ...

  10. 用户中心mysql数据库表结构的脚本

    /* Navicat MySQL Data Transfer Source Server : rm-m5e3xn7k26i026e75o.mysql.rds.aliyuncs.com Source S ...