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. jquery 元素文本取值/赋值

    select元素选中option值 jq $("#select1 option:selected").text(); $("select id或class option: ...

  2. ThreadLocal 的分析

    http://blog.csdn.net/LHQJ1992/article/details/52451136 个人感觉这是所有关于ThreadLocal里中最靠谱的一篇文章. ps:其实官方文档才是最 ...

  3. 用btrace定位问题

    btrace 截取方法出入参 用btrace的手法,网上有很多.简单记录下我自己的使用经历. btrace脚本: import static com.sun.btrace.BTraceUtils.ex ...

  4. python基础-文件和目录

    字符串小练习 >>> s="1a2a3a4a5a" >>> s1=s.split('a') >>> >>> ...

  5. centos 修改时间 计划任务

    centos 修改时间 计划任务 一,系统时间修改   1 远程连接到centos 或者直接登录系统 #date 查看系统时间 如下图所示 2 #date -s 修改时间 看下面的例子#date -s ...

  6. Django深入----django.db.transaction

    django 的事务: transaction.py atomic---原子性 def atomic(using=None, savepoint=True): # Bare decorator: @a ...

  7. shell的格式化输出命令printf

    printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同. 注意:printf 由 POSIX 标准所定义,移植性要比 ech ...

  8. (绝对有用)iOS获取UUID,并使用keychain存储

    原文链接 http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html UDID被弃用,使用UUID来作为设备的唯一标识.获取到UUID后,如果用NSUse ...

  9. BZOJ 2693 jzptab ——莫比乌斯反演

    同BZOJ 2154 但是需要优化 $ans=\sum_{d<=n}d*\sum_{i<=\lfloor n/d \rfloor} i^2 *\mu(i)* Sum(\lfloor \fr ...

  10. 学习shell脚本之乘法口诀

    脚本如下: #!/bin/bash for i in 'seq 1 9' do for j in 'seq 1 $i' do k=$[$i*$j] echo -ne "$j"&qu ...