01
预处理概览
C语言编译流程(预处理、编译、汇编、链接),预处理器的角色与功能,常见预处理指令一览。
编译流程预处理器
02
#define基础
宏定义的本质(文本替换),无参宏的定义与使用,宏定义的作用域与#undef。
文本替换作用域
03
带参宏
带参宏的定义与调用,宏参数与函数参数的区别,常见陷阱(括号问题、副作用)。
宏参数陷阱
04
宏与函数的抉择
性能对比(内联展开 vs 函数调用开销),类型安全,代码膨胀,可调试性。
内联性能
05
#与##运算符
字符串化运算符#,标记粘贴运算符##,实用案例(日志宏、通用数据结构)。
字符串化粘贴
06
条件编译 (#if, #ifdef, #ifndef)
条件编译的基本语法,调试开关与平台适配,头文件保护符(#pragma once vs #ifndef)。
条件编译头文件保护
07
#elif与#else
多分支条件编译,复杂条件表达式(defined() 运算符),实战:跨平台代码管理。
多分支跨平台
08
#include机制
头文件包含的两种形式(<> 与 ""),搜索路径规则,嵌套包含与重复包含问题。
头文件搜索路径
09
#pragma指令
#pragma once,#pragma pack(内存对齐),#pragma message,#pragma GCC poison。
内存对齐编译器
10
预定义宏
标准预定义宏(__FILE__, __LINE__, __DATE__, __TIME__),编译器相关宏(__GNUC__, _MSC_VER),平台检测宏。
__FILE__平台检测
11
#error与#line
#error 指令(编译期断言),#line 指令(调试信息控制),实战:版本检查与编译约束。
编译期断言调试
12
宏的副作用与陷阱
参数多次求值,运算符优先级问题,分号吞噬问题,do-while(0) 惯用法。
副作用do-while(0)
13
X-Macro 模式
X-Macro 的基本原理,代码生成与数据驱动,实战:枚举与字符串表的自动同步。
X-Macro代码生成
14
宏与断言
assert() 宏的实现原理,自定义断言宏(带错误信息、带日志),静态断言(_Static_assert)。
断言静态断言
15
宏与日志系统
可变参数宏(__VA_ARGS__),日志级别控制,文件行号自动注入,实战:轻量级日志库。
可变参数日志
16
宏与泛型编程
_Generic 关键字(C11),类型泛型宏,模拟函数重载,实战:通用数学函数。
_Generic泛型
17
宏与代码生成
宏生成函数/结构体模板,重复代码消除,实战:寄存器位操作宏。
代码生成位操作
18
宏与单元测试
测试框架中的宏应用(TEST, ASSERT_EQ),模拟与桩函数,覆盖率统计宏。
单元测试桩函数
19
宏与配置管理
编译时配置开关,特性标志(feature flag),模块化配置宏,实战:产品线差异化。
配置开关特性标志
20
宏与内存管理
自定义内存分配器宏(malloc/free 包装),内存泄漏检测宏,对齐分配宏。
内存分配泄漏检测
21
宏与错误处理
错误码宏,异常模拟(setjmp/longjmp 包装),资源清理宏(RAII 模拟)。
错误码RAII
22
宏与数据结构
链表宏(Linux 内核 list_head),哈希表宏,红黑树宏,实战:通用容器。
list_head通用容器
23
宏与状态机
状态机宏定义,事件驱动宏,状态转换表宏,实战:协议解析器。
状态机事件驱动
24
宏与回调机制
回调函数注册宏,事件分发宏,观察者模式宏实现。
回调观察者模式
25
宏与编译器优化
likely/unlikely 宏(分支预测),内联提示(inline),对齐提示。
分支预测likely
26
宏与安全编程
防缓冲区溢出宏,安全字符串操作宏,整数溢出检测宏。
安全溢出检测
27
宏与嵌入式开发
寄存器地址映射宏,位域操作宏,中断处理宏,实战:MCU 驱动库。
寄存器嵌入式
28
宏与多线程
线程局部存储宏(__thread),原子操作宏,锁封装宏,实战:无锁队列宏。
多线程无锁队列
29
宏的调试与测试
宏展开查看(-E 选项),宏断点技巧,宏单元测试,常见宏错误排查。
宏展开调试
30
宏的最佳实践与反模式
命名规范,括号使用铁律,宏文档化,避免魔数,可移植性考量,总结与展望。
最佳实践反模式