C++预处理过程详解

g++预处理过程究竟发生了什么?下面我们就通过对比*.cpp源文件和生成的*.i文件的内容来进行逐一叙述。

simple.cpp文件内容只包含一个头文件:

cpp 复制代码
#include "simple.hpp"
cpp 复制代码
#include "header.hpp"

int a;
cpp 复制代码
char header[] = "header";

仅进行预处理:

bash 复制代码
g++ -E simple.cpp -o simple.o

输出结果simple.i内容如下:

bash 复制代码
# 0 "simple.cpp"       // 开始处理simple.cpp,重置行号为0
# 0 "<built-in>"       // 切换到内置宏定义的位置
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "simple.cpp"
# 1 "simple.hpp" 1
# 1 "header.hpp" 1
char header[] = "header";
# 2 "simple.hpp" 2

int a;
# 2 "simple.cpp" 2
符号 含义 具体含义
# 指令标识符 表示这是一条预处理指令
#后的数字 行号 表示接下来的代码对应的原始文件的行号
"simple.cpp" 文件名 表示接下来的代码来事simple.cpp
每行后面的数字1 行标记指令 新文件的开始,通常是#include引入的文件
每行后面的数字2 行标记指令 返回到上一个文件
每行后面的数字3 行标记指令 系统头文件
每行后面的数字4 行标记指令 extern "C"

simple.i我们可以看到以下几点:

cpp 复制代码
// 文件信息宏
#define __FILE__ "simple.cpp"       // 当前文件名
#define __LINE__ 4                  // 当前行号(在printf语句处)
#define __DATE__ "Jan 27 2026"      // 编译日期
#define __TIME__ "12:34:56"         // 编译时间

// 编译器信息宏
#define __cplusplus 201703L         // C++17标准
#define __GNUC__ 13                 // GCC 13版本
#define __GNUC_MINOR__ 2            // GCC 13.2
#define __VERSION__ "13.2.0"        // 完整版本

// 系统环境宏
#define __linux__ 1                 // Linux系统标识
#define __x86_64__ 1                // 64位架构
相关推荐
whcyhhh8 分钟前
头歌实践教学平台:大数据存储2023(十三3)
大数据·开发语言·python
2601_9561219728 分钟前
线性DP(入门)
c++·算法·动态规划
彷徨而立36 分钟前
【C/C++】多线程读写普通 int 变量的一些问题
java·c语言·c++
Freak嵌入式1 小时前
树莓派 Pico GPIO 深度解析:从 MCU 架构到寄存器控制,底层原理与实践指南
java·开发语言·科技·单片机·嵌入式硬件·架构
蒸蒸yyyyzwd1 小时前
cpp web server 面试可能问题总结
c++·笔记·八股
啊啊啊啊啊!!!!1 小时前
【c++】map和set的使用
开发语言·c++
hu9245195591 小时前
Matlab保护源代码—P文件和exe文件详细解析
开发语言·matlab
for_ever_love__1 小时前
python爬虫: GET请求与POST请求
开发语言·爬虫·python·网络编程
Freak嵌入式1 小时前
实战对比:用 mpremote/Putty/MobaXterm 连接树莓派 Pico REPL,谁更省心?
java·大数据·开发语言·科技·单片机·嵌入式硬件
ttwuai1 小时前
Go 后台管理系统组件库文档怎么写,才不会坑后续维护?
开发语言·javascript·golang