### 编译 - 1 C 源码→预处理 #### 1. 链路定位 * 在整册链路中的位置:编译链六层的第一层,逆向链路的最上游。后续所有反汇编看到的指令,都以预处理后的翻译单元为输入。 * 作用:决定编译器 "最终看到的源码形态",本身不产生机器码。研判阶段用它判断 "这段逻辑是否被编进最终产物"。 #### 2. 前置知识 * C 预处理指令:`#define`、`#include`、`#ifdef/#ifndef/#else/#endif`、`#pragma`。 * 理解 "宏是纯文本替换",不是函数调用。 * 头文件 `#include` 是把指定文件原文插入当前位置。 #### 3. 技术原理 * 预处理器逐行读取 `.c`:展开对象式 / 函数式宏、插入被包含头文件内容、按条件编译保留或丢弃分支、删除注释并生成行控制标记。 * 产物是一个拼接后的翻译单元(translation unit),仍为纯 C 文本,交给下一层前端。 * 【源码漏洞】宏拼接错误、条件分支不一致、依赖隐式声明。【配置缺陷】构建脚本 `-D` 宏开关与源码默认值冲突、包含