一、typedef用法

   typedef常用来定义一个标识符及关键字的别名,它生效是在语言编译过程,但它并不实际分配内存空间。typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”的缺点。举例如下:

a、先声明一个类型

 typedef   (int*)     pINT;

b、使用这个类型

pINT a;

  在编译的时候,定义了一个指向整型变量的指针。

二、define的用法

  “#define”为宏定义语句,它在预编译时将所定义的语句展开。举例如下:

a、先定义一个宏

#define pINT int *

b、使用这个宏

pINT a;

  在预编译阶段,将宏展开为“int *”,在编译阶段定义一个指向整型变量的指针。

三、typedef与define的区别和联系

1、 两者发生作用的时机

  typedef  作用在编译阶段

  define  作用在预编译阶段

2、 两者的用途

  typedef 

为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

  define

(1) 方便程序的修改
使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 我们可以用较短的有意义的标识符来写程序,这样更方便一些。
(2) 提高程序的运行效率
使用带参数的宏定义可完成“函数调用所完成的功能”,又能减少系统开销,提高运行效率。

3、 两者的联系

  typedef能完成的功能,define也能完成,从“1、typedef用法”和“2、#define的用法”所举的例子

中可以看出。

  不过,我想说的是:尽管define能完成属于typedef分内的事,但是尽量不要让define越俎代庖。

四、typedef与define区别举例

测试程序

 #include <stdio.h>

 3 typedef int * pINT;
4 #define INTP int * 7 int main()
8 {
9 int a1;
10 int a2;
11 const pINT p1 = &a1;
12 const INTP p2 = &a1; 14 p1 = &a2;
*p1 = a2; 17 *p2 = a2;
p2 = &a2; return ;
}

编译错误提示

Compiling...
program.cpp
G:\C\const_test\program.cpp(14) : error C2166: l-value specifies const object
G:\C\const_test\program.cpp(17) : error C2166: l-value specifies const object

执行 cl.exe 时出错. program.obj - error(s), warning(s)

  提示的错误信息无法是说const变量,被赋予了新值,这是不允许的。

1、红色的错误(typedef引起的错误)

   typedef int * pINT;   给(int *)起了一个别名pINT
  const pINT p1 = &a1;   定义了一个常指针p1,并指向a1

   p1 = &a2;        更改p1的指向的时候,提示错误

2、绿色的错误(define引起的错误)

  #define INTP int *     定义宏INTP

  const INTP p2 = &a1;   定义了一个指向常整型变量a1的指针

  *p2 = a2;          更改指向整型变量a1值的时候,提示错误

3、分析所得  

<1> typedef

   typedef int * pINT;   
  const pINT p1 = &a1;

  相当于  

int * const p1 = &a1

 <2> define

   #define INTP int *    
   const INTP p2 = &a1;

  相当于  

const int * 或者int const *  

<3> 总结

  可以看到typedef对(int *)有一种包装作用,而define完全就是替换展开。

参考网页:typedef和#define的用法与区别

 

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 的区别

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

  6. typedef 优于 #define

    案例一: 通常讲,typedef要比#define要好,特别是在有指针的场合.请看例子: typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2 ...

  7. typedef和#define的区别

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

  8. typedef和define的作用域

    typedef: 如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾: 如果放在某个函数内,定义域就是从定义开始直到该函数结尾: #define: 不管是在某个函数内,还是在所有函数之外,作用 ...

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

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

随机推荐

  1. BA - 读书雷达10本必读书

    https://www.douban.com/doulist/43172796/ 用户故事与敏捷方法 入门篇之一: “是每个ThoughtWorks BA都读的经典入门书籍,详细介绍了用户故事及实用操 ...

  2. PureMVC(JS版)源码解析(三):Observer类

          上一篇博客中,我们讲到了Notification类(消息类),Notification(消息)是连接观察者(observer)和通知者(notifier)之间的桥梁.这一篇博客,主要是在代 ...

  3. Visual Studio 调试技巧 (三) -- 调试第三方组件代码

    上次我们提到,没有源代码而且没有调试符号,我们也可以 Debug.有人可能会问,我什么时候需要在这种情况下调试吗?! 是的.比方说,我们用了某些第三方的组件,这些组件里面难免也会有 Bug.就算是微软 ...

  4. WebService学习笔记系列(二)

    soap(简单对象访问协议),它是在http基础之上传递xml格式数据的协议.soap协议分为两个版本,soap1.1和soap1.2. 在学习webservice时我们有一个必备工具叫做tcpmon ...

  5. 【Android】Intent的使用-返回数据给上一个活动

    第一个Activity  A启动另外一个Activity B,B返回数据给A ============================================================= ...

  6. Linux自动化运维部署+运维

    自动化部署及配置(Cobbler/Kickstart) 红帽发布的网络安装服务器套件 Cobbler可以说是一大Linux装机利器,可以快速的建立网络安装环境,据说比Kickstart还要好用. 分布 ...

  7. MAC OS X API知识摘抄

    本文为信息为网上各个地方收集整理Carbon和Cocoa,Toolbox,POSIX,JAVA并列成为Mac OS X五个主要的API.与Cocoa相较之下,Carbon是非物件导向(Procedur ...

  8. PS之放射背景

    效果图 素材 新建图层,填充颜色 新建图层,矩形工具画条形 滤镜-扭曲-极坐标 合并图层,效果如下 新建图层,画一个适当的圆 滤镜-模糊-高斯模糊 将素材人物抠出来放在中间

  9. css制作导航栏的上下三角

    1)先完成一个导航条 <style type="text/css"> .nav-ul{ list-style: none; } .nav-ul li{ width: 1 ...

  10. dynamic 和var

    dynamic,编译后被转换成带有 dynamicAttribute的object对象,可用在方法参数,返回值活或者局部变量上 执行过程: 运行时绑定首先会检查是否继承IDynamicMetaObje ...