搜索
bottom↓
回复: 13

请教下,#define和typedef的区别

[复制链接]

出0入0汤圆

发表于 2013-2-25 11:07:03 | 显示全部楼层 |阅读模式
怎么我感觉功能都差不多嘛,多数时候可以相互替代?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入4汤圆

发表于 2013-2-25 11:14:03 | 显示全部楼层
不写非常复杂,而且有指针神马的代码,肯定可以通用...

比较杯具的是source insight不能识别出由typedef定义的类型来定义的变量,
所以我写代码就用define居多.

出0入0汤圆

 楼主| 发表于 2013-2-25 11:16:18 | 显示全部楼层
书上写的#define是预处理命令,只占用编译时间,那么typedef是神马情况?

出0入8汤圆

发表于 2013-2-25 11:20:11 | 显示全部楼层
网上搜的:
从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量

,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#define

INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的

编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗

长的类型的别名。

宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变

量的功能。请看上面第一大点代码的第三行:

typedef    (int*)      pINT;
以及下面这行:
#define    pINT2    int*

效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;

表示定义了一个整型指针变量a和整型变量b。

注意:两者还有一个行尾;号的区别哦!

出0入0汤圆

发表于 2013-2-25 11:23:38 | 显示全部楼层
如果正确使用的话,define和typedef是效果上是类似的。

define工作在预处理阶段,是机械的直接展开;typedef是编译阶段的工作。

define因为没有语义,只是机械展开,所以容易出错。typedef相对安全一些。

出0入0汤圆

发表于 2013-2-25 11:29:31 | 显示全部楼层
typedef是定义了一种类型
define只是简单的替换

出0入0汤圆

发表于 2013-2-25 14:01:36 | 显示全部楼层
我是这样理解的,#define  换包装    (其实是一样的东西,在预处理时进行)
                        typedef  就是起别名(就是一个代号,在编译时进行)

出0入93汤圆

发表于 2013-2-25 14:40:15 | 显示全部楼层
#define就是双刃剑,用的好很锋利,用不好会伤到自己。
我一般的原则,能使用typedef的一律typedef。对enum、inline之类一律等同,坚决反对#define一切的风格。

区别代码1:
  1. typedef int* IntPtr;
  2. IntPtr a, b;         //b是int*类型

  3. #define IntPtr int*
  4. IntPtr a, b;         //b是int类型,与我们的意图相悖
复制代码
区别代码2:
  1. typedef struct {
  2.     int a;
  3. } CMyType;
  4. CMyType a, b;

  5. #define CMyType struct { int a; }      //不好意思,从来没有见过谁这么用的
  6. CMyType a, b;                               //a, b的类型都不兼容了……
复制代码

出0入0汤圆

发表于 2013-10-12 21:04:34 | 显示全部楼层
学习了……

出0入0汤圆

发表于 2013-10-12 21:18:31 | 显示全部楼层
基本上是没有什么区别的
都是预处理指令
#define 是替代指令,用字母代替常量
#typedf 不仅是替代指令,而且可以限制常量的类型

出0入0汤圆

发表于 2013-10-13 19:05:54 | 显示全部楼层
楼主的问题,俺也一直有同样的疑问~哈哈

出0入0汤圆

发表于 2013-10-15 01:27:25 | 显示全部楼层
学习课~~  

出0入0汤圆

发表于 2013-10-15 12:17:40 来自手机 | 显示全部楼层
楼主问的好,我也学习了~~

出0入0汤圆

发表于 2013-11-21 21:11:20 | 显示全部楼层
这问题也困扰我,学习了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表