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位架构
相关推荐
kkeeper~2 小时前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行2 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker2 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
盲敲代码的阿豪2 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
basketball6163 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报3 小时前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080163 小时前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
想唱rap4 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
@杰克成4 小时前
Java学习30
java·开发语言·学习
三品吉他手会点灯4 小时前
C语言学习笔记 - 40.数据类型 - scanf函数的编程规范与非法输入处理
c语言·开发语言·笔记·学习