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. 无语法校验坑

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

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

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

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

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

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

相关推荐
Zwawa1 小时前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
c语言·单片机·嵌入式
SomeOtherTime1 小时前
Rust 面向对象介绍(AI回答)
开发语言·python·rust
zh_xuan2 小时前
kotlin常见面试题
开发语言·kotlin·面试题
草莓熊Lotso3 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
huaqianzkh5 小时前
WinForm C#:循环修改控件UI闪烁卡顿?SuspendLayout / ResumeLayout 与 BeginUpdate 优化
开发语言·ui·c#
沐晓时光15 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
Zwawa18 小时前
C语言函数指针与宏实战:从回调、表驱动菜单到X-Macro,讲透嵌入式代码解耦
c语言·单片机·嵌入式
David猪大卫21 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger21 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
fengci.1 天前
CTF2MISC中等部分
开发语言·前端·学习