typedef和define的详细区别

2011-04-19 15:11 firnow firnow 字号:T | T

对于都可以用来给对象取一个别名的Typedef和define来说,是有区别的。本文通过对typedef和define的介绍,来给读者详细的讲解它们存在的本质区别,供参考。

AD:51CTO学院:IT精品课程在线看!

typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。 #define是预处理指令。下面让我们一起来看。

typedef是C语言语句,其功能是用户为已有数据类型取“别名”。

例如:

  1. typedef int INTEGER;

这以后就可用INTEGER来代替int作整型变量的类型说明了,如:

  1. INTEGER a,b;

用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。例如:

  1. typedef int a[10];//表示a是整型数组类型,数组长度为10。

然后就可用a说明变量,如:

  1. a s1,s2;//完全等效于:int s1[10],s2[10] ;

同理 typedef void (*p)(void) 表示p是一种指向void型的指针类型!

#define是预处理中的宏定义命令,例如:

  1. #define int PARA

表示在源程序中的所在int将会被PARA原样代替!

如:程序中有int a,b ;则在编译前将被替换为PAPA a,b;

#define是C中定义的语法,typedef是C++中定义的语法,二者在C++中可以通用,但#define成了预编译指令,typedef当成语句处理。Typedef和define都可以用来给对象取一个别名,但是两者却有着很大不同。

1. 首先,二者执行时间不同

关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。

Define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

#define用法例子:

  1. #define f(x) x*x
  2. main( )
  3. {
  4. int a=6,b=2,c;
  5. c=f(a) / f(b);
  6. printf("%d \n",c);
  7. }

程序的输出结果是: 36,根本原因就在于#define只是简单的字符串替换,应当加个括号“(X*X)”。

2. 功能不同

Typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。

如:

  1. typedef int (*PF) (const char *, const char *);

定义一个指向函数的指针的数据类型PF,其中函数返回值为int,参数为const char *。

typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以i获得最高的精度:

  1. typedef long double REAL;

在不支持 long double 的机器上,该 typedef 看起来会是下面这样:

  1. typedef double REAL;
 

并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:

  1. typedef float REAL;

#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

3. 作用域不同

#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。

  1. void fun()
  2. {
  3. #define A int
  4. }
  5. void gun()
  6. {
  7. //在这里也可以使用A,因为宏替换没有作用域,
  8. //但如果上面用的是typedef,那这里就不能用A ,不过一般不在函数内使用typedef
  9. }

4. 对指针的操作

二者修饰指针类型时,作用不同。

  1. Typedef int * pint;
  2. #define PINT int *
  3. Const pint p;//p不可更改,p指向的内容可以更改,相当于 int * const p;
  4. Const PINT p;//p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;
  5. pint s1, s2; //s1和s2都是int型指针
  6. PINT s3, s4; //相当于int * s3,s4;只有一个是指针。

其实,typedef和define末尾的标号也是不一样的,希望大家不要忽略这一点。通过本文的分析,相信你已经了解了这两者之间的区别。掌握了区别之后,运用起来会更加的灵活。

-----转自-------------http://developer.51cto.com/art/201104/256060.htm

转载于:https://www.cnblogs.com/hackerl/p/3704369.html

#define 和typedef的区别相关推荐

  1. #define与typedef的区别!

    #define与typedef的区别! #define dPS struct s * typedef struct s * tPS; 以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构 ...

  2. C语言 #define 与 typedef 的区别

    C语言 #define 与 typedef 的区别与用法 (qq.com) 在C语言编程中,typedef 和 #define是最常用语句,可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别 ...

  3. 《c专家编程》笔记--define和typedef的区别

    #include <stdio.h> #define peach int typedef int banana;int main(void){unsigned peach a;unsign ...

  4. #define、typedef与const

    #define.typedef与const #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读 ...

  5. #define用法以及#define和typedef区别

    1.简单的define定义 #define MAXTIME 1000 2.define的"函数定义" define可以像函数那样接受一些参数,如下 #define max(x,y) ...

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

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

  7. 【转载】define与typedef区别与联系

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

  8. #define const typedef

    #define用法 1. 定义简单的常数:定义常量,便于修改 #define N 1000 2. 定义简单的函数:注意多使用括号 define可以像函数那样接受一些参数,如下: #define max ...

  9. 关于#define和typedef

      关于#define和typedef 付吉祥 2009-05-29 10:36 请见代码: Code: #define  a int; unsigned a i;//right typedef in ...

最新文章

  1. java list 常见的使用方法
  2. 从一个小demo开始,体验“API经济”的大魅力
  3. USACO 3.1 Agri-Net 最短网络 (最小生成树)(普里姆算法)
  4. android listview使用自定义的adapter没有了OnItemClickListener事件解决办法
  5. 限制对web路径的访问
  6. Linux netfilter源码分析(3)
  7. clion中自定义消息msg消息时定义的msg文件有类型提示
  8. 面向对象编程的四大特性
  9. 几招叫你如何防止卡巴斯基Key被封
  10. VC6.0新建工程——Win32 Application和Win32 Console Application
  11. Astar算法基本概念及其实现
  12. web前端教程,详解引入CSS的4种方式
  13. 复习一下forearch
  14. P2504 [HAOI2006]聪明的猴子
  15. 一道简单的CTF登录题题解
  16. 解决Chrome 70版本以后谷歌不再信任赛门铁克证书问题
  17. 视频剪辑方法,在视频上添加图片或者视频
  18. 服务器默认管理口登录信息(默认IP、用户名、密码)大全
  19. HTML表格标签详解
  20. 北京积分落户需要多少年才能上岸

热门文章

  1. java flv转mp3_java调用FFmpeg及mencoder转换视频为FLV并截图
  2. 总结jQuery中的DOM节点属性
  3. 如何手动结束Python的子线程和子进程
  4. python 小括号转译_Python-HTML转义字符
  5. 将 ERP 与 PPM 系统集成的 5 个理由
  6. 云服务器分割成虚拟主机销售,IDC行业为何兴起云虚拟主机业务
  7. Android 仿微信小程序开屏页加载loading
  8. 【Java知识体系】Redis实用教程,深入原理
  9. velodyne+cartographer 2D构建栅格地图
  10. ubuntu 20 安装 velodyne_simulator