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位架构
相关推荐
Z9fish6 分钟前
sse哈工大C语言编程练习20
c语言·开发语言·算法
Trouvaille ~9 分钟前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
June`18 分钟前
高并发网络框架:Reactor模式深度解析
linux·服务器·c++
小镇敲码人29 分钟前
剖析CANN框架中Samples仓库:从示例到实战的AI开发指南
c++·人工智能·python·华为·acl·cann
萧鼎30 分钟前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
Anastasiozzzz1 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
刘琦沛在进步1 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
机器视觉的发动机1 小时前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
HyperAI超神经1 小时前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
R_.L2 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt