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

  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类型的变量。

typedef和#define的差别——————【Badboy】的更多相关文章

  1. typedef和define具体的具体差别

      1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,仅仅有在编译已被展开的源程序时才会发现可能的错误并报错.比如: #define PI 3. ...

  2. typedef和define具体的具体差异

      1) #define这是一个预处理指令,简单的更换当预处理程序.不检查的正确性,仍不能正常关机进入的意思,那里只是已被展开时编译源代码会发现可能的错误和错误. 例如: #define PI 3.1 ...

  3. const、typedef 、 define总结

    constkeyword const=read only,修饰的为仅仅读变量而不是常量.const修饰的变量不能用作数组的维数也不能放在switch语句的case:之后. 主要作用有: 1.通过把不希 ...

  4. typedef和#define的用法与区别

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

  5. typedef 与define 的区别

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

  6. typedef和#define的区别

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

  7. typedef和define具体的详细区别

    1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如: #define PI 3.141 ...

  8. 【转】typedef和#define的用法与区别

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

  9. (转)typedef和#define的用法与区别

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

随机推荐

  1. Python 轻量化简繁转换

    最近项目中用到了简单的简繁转换,如果用OpenCC太重了,于是搜到了 zhconv 这个库. zhconv 提供基于 MediaWiki 词汇表的最大正向匹配简繁转换,Python 2, 3 通用. ...

  2. Redis学习笔记01---配置文件

    1.配置文件用法 启动redis的时候指定配置⽂件路径: ./redis-server /path/to/redis.conf 不指定配置⽂件的时候使⽤内置配置⽂件启动,此⽅法仅适⽤于开发和测试. 2 ...

  3. HDU 3943 K-th Nya Number

    K-th Nya Number Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Origina ...

  4. ImportError: No module named ‘MySQLdb'

    1.APP未注册 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contentty ...

  5. Windows Server AppFabric

    文章:Windows Server AppFabric简介 介绍了AppFabric强大的功能.

  6. Tomcat基础配置(一)

    详情请看散尽浮华的tomcat相关配置技巧梳理 本次只用于自己的查看,谢谢作者的谅解. tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomc ...

  7. 【bzoj1174】[Balkan2007]Toponyms Trie树

    题目描述 给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. 输入 第一行给出数字N.N在[2,1000000] 下面N行描述这些字符串,长 ...

  8. 【Luogu】P1352没有上司的舞会(树形DP)

    题目链接 设f[i][0]表示第i个人不去舞会时子树的最大欢乐度,f[i][1]表示第i个人去舞会时子树的最大欢乐度. 则有状态转移方程:f[i][0]+=∑max(f[to][0],f[to][1] ...

  9. 【容斥】HDU 4135 Co-prime

    acm.hdu.edu.cn/showproblem.php?pid=4135 [题意] 询问[a,b]中与n互质的数有多少个 [思路] 考虑[1,m]中与n互质的数有多少个,答案就是query(b) ...

  10. 单点登录跳转失败(原因是 主票据申请子票据失败) asp.net 同站点下不同应用间不同版本Framework问题

    单点登录跳转失败(原因是 主票据申请子票据失败) asp.net 同站点下不同应用间不同版本Framework问题 今天遇到一个问题,在主站点现在配置的应用和主站点登录会话状态不能共享,进入子站点应用 ...