• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2026-04-03 16:30 Aet 隐藏边栏 |   抢沙发  1 
文章评分 1 次,平均分 5.0

概述

预处理阶段的本质

  1. 对源码做文本级别的变换,把编译器不认识的预处理指令(#开头的东西)全部处理掉,输出一个纯粹的、编译器可以直接解析的 C/C++ 代码文件
  2. 宏替换是其中最核心的操作,但 #include 展开和条件编译同样重要——实际项目中,#include 展开带来的代码量远超宏替换

示例

规则

Linemarker 的完整格式

  1. 行号和文件名是必须的,标志是可选的,可以有零个、一个或多个
  2. 标志之间用空格分隔

  1. 四个标志的含义

示例解析

  1. 没有标志。这是最开始的声明:
    1. "我们在 test.cpp 的第 1 行"
    2. 文件处理的起点,不需要标志

  1. 标志 1
    1. 进入了一个新"文件"——编译器的内置定义(不是真实文件,是编译器自动注入的预定义宏,比如 __GNUC____x86_64____cplusplus 等)

  1. 标志 3
    1. 告诉编译器把内置定义当作系统头文件对待(抑制某些警告)

  1. 标志 3
    1. 还在内置定义中,跳到了第 404
    2. 中间那些行是几百个预定义宏,被预处理器省略了(因为宏定义在预处理后消失,只留下宏展开的结果)

  1. 标志 1
    1. 进入了"命令行"这个虚拟文件——处理你在编译命令中通过 -D 指定的宏定义
    2. 你没有指定任何 -D,所以这部分是空的

  1. 标志 2
    1. 从命令行虚拟文件返回到上层(built-in

  1. 标志 2
    1. 从内置定义返回,回到 test.cpp1 行。现在开始处理你的源码了

  1. 标志 13
    1. 两个标志同时出现,含义是:进入一个新文件(标志 1)并且这个文件是系统头文件(标志 3)。
    2. 你的代码第 1 行是 #include <cstdio>,所以预处理器现在进入了 cstdio 这个系统头文件

  1. 只有标志 3
    1. 还在 cstdio 文件中,跳到了第 40 行(前面的行是注释和条件编译指令,预处理后被去掉了)
    2. 没有标志 1 因为没有进入新文件,没有标志 2 因为没有返回上层。只保留标志 3 提醒编译器这仍然是系统头文件

  1. 标志 13
    1. cstdio 内部又 #includebits/c++config.h,进入了这个新的系统头文件

  1. 只有标志 3
    1. 还在 c++config.h 中,跳到第 296

  1. 只有标志 3
    1. 同一个文件内跳到第 329

标志组合的所有可能性

实际的 include 嵌套

预处理器

预处理器的完整工作清单

预处理后什么消失了,什么保留了

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享