#define 和typedef 的关系

本文详细探讨了C语言中#define预处理指令和typedef关键字的区别,包括它们的原理、声明方式、时间消耗、作用域及对指针操作的影响。#define在预处理阶段进行简单替换,无类型检查,而typedef在编译时处理,具备类型检查功能,适用于定义复杂类型。在指针操作中,typedef可以创建更具安全性的类型。此外,typedef在连续定义变量时能确保类型一致性。
摘要由CSDN通过智能技术生成

目录

1.概念

2.区别 

原理不同

声明方式不同

时间消耗不同

作用域范围不同

对指针的操作不同

定义变量的类型保证度上不同


1.概念


#define 它在编译预处理时进行简单的替换,不作正确性检查。它是预处理指令。

typedef 它在自己的作用域内给一个已经存在的类型一个别名。它是在是在编译时处理的。

2.区别 


原理不同


#define 是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。

typedef 是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。而它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。

例如:

#define INT1 int
unsigned INT1 n;  //(1)
typedef int INT2;
unsigned INT2 n;  //(2)

(1) 不会报错,因为INT1是用#define 的宏定义声明的,因此可以使用类型说明符unsigned进行扩展,

(2) 会报错,因为INT2是用typedef 的关键字声明的,因此不能使用unsigned进行扩展。

声明方式不同


#define 的声明方式为:

#define 新名字 旧名字

typedef 的声明方式为:

typedef  旧名字 新名字 ;

需要注意的是,#define之后不带分号,typedef之后带分号。

时间消耗不同


#define 比较考虑大体全局,在编译之前就已经预处理,进行简单替换了,完成了交接工作,几乎不占用时间

而 typedef 比较在意时事安全性,它是在编译的时候才进行出来,并且检测类型是否正确,因此需要消耗一定的时间。

作用域范围不同


#define 由于已经在整体范围内发布声明,因此无论在哪定义过,在其它的地都可以使用

typedef 由于更在意时事性,所以只能在定义的作用域内使用

对指针的操作不同


看到这里,会发现#define好像在性能都比typedef更强,但typedef 真的就完全不如 #define 吗?

对于以下这个例子 

#define INT1 int *
typedef int * INT2;

    int a =1;
    int b =2;
    const INT2 p1=&a; //(1)
    *p1=1;
    p1=&b;  //(2)
    const INT1 p2 =&a;//(3)
    p2=&b;
    *p2=1;  //(4)

(1) 相当于 int * const p1;  p1 不可以更改但指向的内容能被修改,因此(2)会报错

(3) 相当于 int * const p1;  p1 不可以更改但指向的内容能被修改,因此(4) 会报错

定义变量的类型保证度上不同


在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。

例如

#define INT1 int*;
P_INT1 p1,p2;  //即int *p1,p2;
typedef int* INT2;
P_INT2 p1,p2;  //p1、p2 类型相同

INT1所定义的p1与p2类型不同,即p1为指向整形的指针变量,p2为整形变量;

INT2定义的p1与p2类型相同,即都是指向 int 类型的指针。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫喃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值