预编译这块,别只会写 #define

很多写 C 的人对预编译的理解,基本停留在“宏就是替换、头文件就是引库”的层面。真到了看 Linux 内核源码或者排查跨平台编译报错时,满屏的 #ifndef、##、#undef 直接让人发懵。这门课解决的正是这个能力缺口:它不跟你扯语法表面,而是把宏定义、条件编译、头文件包含和特殊预编译关键字放在真实工程场景里拆解。你得明白,预编译阶段处理的不是运行逻辑,而是代码生成前的“文本加工”。如果你连宏展开后的副作用、条件编译怎么控制代码裁剪都说不清,那这块底子就是虚的,别假装自己懂 C。这门课适合有一定 C 语法基础、能写出基本函数但没系统啃过预处理器机制的人,如果你连指针和结构体都还发怵,建议先补基础再看。

从哪里开始看,怎么配合资料练

建议先从宏定义的注意事项和预定义宏这两块入手,这是理解后续复杂用法的地基。不要光听,资料包里每一节对应的示例代码必须自己敲一遍。重点放在“宏的深入用法举例”那几节,这部分讲的是实际工程里怎么用宏做类型泛化、字符串化、拼接,以及怎么避开宏展开的坑。配合练习时,自己写几个带参数的宏,然后用编译器的只预处理选项(比如 gcc 的 -E)查看展开结果,对比你脑子里的预期和实际输出差在哪。条件编译那块,重点看防止头文件重复包含和跨平台应用,自己写一个跨平台头文件,用条件编译切换不同平台的实现,编译跑通。别只看不练,预编译的坑全是手写出来的,不是看出来的。

学完能独立回答什么

看完这几节,你应该能独立完成几件事:写一个不会产生副作用的安全宏,而不是直接写个 #define 就完事;看懂别人代码里复杂的嵌套条件编译,分清哪段代码在什么平台会被编译进去、哪段会被裁掉;设计头文件结构时,知道怎么用条件编译防重复包含,而不是乱加 #pragma once 了事。具体到问题,你得答得清楚:带参宏和函数在调用时到底有什么本质区别?#define 里的 # 和 ## 具体怎么改变文本?预定义宏在调试输出里能帮你省什么事?防止头文件重复包含的两种写法各有啥坑?条件编译在跨平台工程里怎么组织代码分支?如果这些你都能自己讲明白,那这章的预编译底子才算补扎实了。

课程目录

1 本章知识点结构 (06:41)
2 C预编译的回顾 与 无宏体宏 (09:30)
3 有宏体宏 (12:41)
4 宏定义的一些值得注意的地方 (22:10)
5 预定义宏 与 调试宏 (15:09)
6 宏的一些深入用法举例1 (16:09)
7 宏的深入用法举例2 (20:34)
8 宏的深入用法举例3 之 1 (12:15)
9 宏的深入用法举例3 之 2 (19:03)
10 宏的深入用法举例3 之 3 (13:50)
11 宏的深入用法的其它举例 (11:22)
12 条件编译 初认识 (20:23)
13 条件编译关键字1 (11:37)
14 条件编译关键字2 (17:47)
15 条件编译的书写排版 (15:03)
16 条件编译 防止头文件重复包含 (19:52)
17 什么程序的跨平台 (18:33)
18 条件编译 在 C跨平台时的作用 (35:21)
19 调试宏 与 配置文件 (20:52)
20 自己写一个小配置文件 (32:10)
21 其它预编译关键字1 (28:50)
22 其它预编译关键字2 (12:31)
23 其它预编译关键字 3 (17:11)
24 其它预编译关键字4 (33:59)
25 其它预编译关键字5 (21:45)
26 头文件包含 (36:09)