单片机/C/C++八股:(二十三)#define 和 typedef 的区别

上一篇 下一篇
数组名,以及和指针的区别(一/二维数组)

#define 和 typedef 的区别

具体区别:

对比项 #define typedef
功能 文本替换、定义标识符 创建已有类型的别名
类型 预处理指令 关键字
执行时机 预处理阶段(编译前) 编译阶段
作用域 从定义到文件结束(或 #undef 遵循 C 作用域规则(如块、函数、文件)
应用场景 条件编译;定义常量、宏函数 创建已有类型的别名
语句结尾是否要加 ; 不加 ; ;

他们最大的区别就是:作用于已有类型时,#define 只是简单的文本替换,而 typedef 创建的别名是具有同等效力的。这一点在 声明多个变量时尤为明显:(看下列注释)

c 复制代码
#define PTR_INT int*
typedef int* ptr_int;
/* ...... */
PTR_INT a, b;      // 等价于:int* a, b; → a 是指针,b 是 int!
ptr_int x, y;      // x 和 y 都是指针(int*)

#define 定义的内容,只有定义在 .h 文件中,别的文件才能通过引入头文件的方式,使用到这个内容,如果只是在 .c 文件中定义的话,别的文件就算引入了头文件,也无法使用。

并且 #define 不需要顶格,但必须是该行的第一个非空白字符。在函数内部都可以使用。

总结:

  • #define 是预处理指令,用于文本替换、定义标识符。在预处理阶段(编译前)执行。其作用域是从定义到文件结束(或#undef)。常用于条件编译;定义常量、宏函数。
  • typedef 是关键字,用于创建已有类型的别名。在编译阶段执行。在函数内定义:则其作用域遵循 C 的规则(如块、函数、文件),在哪里定义就被限制在哪里(在函数内定义就被限制在函数内,在函数/块之外定义就属于整个文件)。常用于创建已有类型的别名。

相关推荐
别动我齐刘海6 分钟前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
ACP广源盛1392462567312 分钟前
DeepSeek‑V4‑Flash 公测@ACP#昇腾 950 国产算力组合落地,国产 PCIe 交换芯片 IX9104 有哪些硬件机会
大数据·数据库·人工智能·分布式·单片机·嵌入式硬件·microsoft
铅笔小新z16 分钟前
【stm32】RCC 与时钟树
stm32·单片机·嵌入式硬件
AI科技星36 分钟前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星
Henry Zhu1231 小时前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
时空自由民.1 小时前
STM32 IIC HAL库,LL库
stm32·单片机·嵌入式硬件
辰哥单片机设计2 小时前
STM32智能门禁系统(语音版)
stm32·单片机·嵌入式硬件
June`4 小时前
warp shuffle指令
c++·人工智能·算法·cuda
坏柠4 小时前
C语言进阶:从零实现一个可靠的环形缓冲区,吃透回绕、边界与并发
java·c语言·算法
乱七八糟的屋子4 小时前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray