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位架构
相关推荐
qq_4017004118 分钟前
Qt 串口/网口通信:Hex 与 ASCII 编码转换深度指南
开发语言·数据库·qt
佳児素花痴╮29 分钟前
线程知识点
java·开发语言·jvm
学掌门1 小时前
老司机带你十分钟入门Python!
开发语言·python
zhangzeyuaaa1 小时前
深入 Ruby:return 退出规则完全指南
开发语言·ruby
shaibdoio2 小时前
AI主动获客的意图识别工程实现:从规则匹配到模型微调
java·开发语言·人工智能·长沙瞬维ai
hetao17338372 小时前
2026-10-08 hetao1733837 的刷题记录
c++·算法
CoderYanger3 小时前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划
Frank_refuel3 小时前
【C++】智能指针
开发语言·c++
泡海椒3 小时前
JQuick-Excel VALIDATION 实战:用作用范围约束 Excel 导入校验
开发语言·python·excel
xuxigifxfh3 小时前
HJ11 数字颠倒
java·开发语言·华为机考