C语言---宏

一、宏的本质(唯一核心)

宏是 #define 定义的预处理纯文本替换。

关键特性(记死这4点):

  • 无类型、不占内存、不运行计算

  • 预处理阶段直接无脑粘贴替换

  • #define 后第一个标识符就是宏名,后面全是替换内容

  • 宏只改代码文本,不参与程序运行

二、宏的两种分类

1. 无参宏(常量/标记)

格式:#define 宏名 内容

用途:定义常量、空宏标记(用于条件编译)

复制代码
#define N 100 // 常量替换 #define DEBUG // 空宏,仅做标记

2. 带参宏(代码模板)

格式:#define 宏名(参数) 表达式

用途:简化简单运算,无函数调用开销

复制代码
#define ADD(a,b) ((a)+(b))

三、宏 vs 变量(最简区分)

  • 宏:改代码文本,预处理生效,无内存无类型

  • 变量:存运行数据,编译运行生效,占内存有类型

四、带参宏必避的3个致命坑(高频报错)

1. 优先级坑(最常见)

参数、整体必须双层加括号,否则运算优先级错乱

❌ 错:#define MUL(a,b) a*b

✅ 对:#define MUL(a,b) ((a)*(b))

2. 参数重复执行坑

参数含i++、函数调用时,宏会重复展开执行,产生逻辑BUG

👉 这种场景坚决不用宏,改用函数

3. 无语法校验坑

宏只替换不检查语法,错误只会在编译阶段暴露,极难排查

五、最终使用准则(精华总结)

  • 固定常量、编译标记:用无参宏

  • 简单四则运算:用带参宏,严格双层括号

  • 复杂逻辑、自增参数、函数传参:一律不用宏

  • 宏名统一全大写,区分变量

相关推荐
H.莓飛5 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1146 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶7 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
小灰灰搞电子7 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放7 小时前
面向对象高级(实战案例)
开发语言·python·学习
·present·8 小时前
CSAPP(lecture 4_01)
c语言·c++
fanruitian8 小时前
python else用法
开发语言·python
FRing038 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿8 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
weixin_417396839 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电