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位架构