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位架构
相关推荐
.select.14 分钟前
c++ 移动赋值/移动构造函数
开发语言·c++
我是鶸25 分钟前
secml-malware python library 源码分析及实践
开发语言·python
散峰而望29 分钟前
【基础算法】从入门到实战:递归型枚举与回溯剪枝,暴力搜索的初级优化指南
数据结构·c++·后端·算法·机器学习·github·剪枝
setmoon21431 分钟前
C++代码规范化工具
开发语言·c++·算法
不想看见40432 分钟前
C++/Qt 代码规范指南
开发语言·qt
li星野1 小时前
QT模拟题:QT项目实践与架构设计(120分钟)
开发语言·qt
汉克老师1 小时前
GESP2026年3月认证C++三级( 第一部分选择题(9-15))
c++·字符串·数组长度·反码·枚举算法·gesp三级·gesp3级
大鹏说大话1 小时前
Java 锁膨胀机制深度解析:从偏向锁到重量级锁的进化之路
开发语言·c#
IT猿手1 小时前
基于 ZOH 离散化与增量 PID 的四旋翼无人机轨迹跟踪控制研究,MATLAB代码
开发语言·算法·matlab·无人机·动态路径规划·openclaw
IT猿手1 小时前
基于控制障碍函数(Control Barrier Function, CBF)的无人机编队三维动态避障路径规划,MATLAB代码
开发语言·matlab·无人机·动态路径规划·无人机编队