C++ 编译原理
C++11 的“编译原理”实际上是指 C++ 源代码在现代编译器(支持 C++11 标准)下,从源码到可执行文件的整个构建过程。C++11 本身是语言标准(ISO/IEC 14882:2011),它定义了语法、语义和标准库接口,但不直接定义编译过程。编译过程由编译器实现,而主流编译器(如 GCC、Clang)通过支持 C++11 标准来解析和生成符合该标准的代码。
下面我将详细说明 Linux 系统下使用 GCC 编译器编译 C++11 代码的完整过程,包括每一步的原理、中间产物、实现机制以及对应的命令和参数。
一、C++ 编译的四个主要阶段
C++ 编译过程通常分为四个阶段:
- 预处理 (Preprocessing)
- 编译 (Compilation)
- 汇编 (Assembly)
- 链接 (Linking)
这些阶段在使用 g++ 命令时通常是自动完成的,但我们可以分步执行以理解其原理。
阶段一:预处理 (Preprocessing)
✅ 目的
处理源文件中的 预处理指令,如:
- #include:包含头文件
- #define:宏定义
- #ifdef / #ifndef:条件编译
- #pragma:编译器指令
✅ 实现原理
预处理器(cpp)读取 .cpp 源文件,递归展开所有 #include 文件,替换宏,删除注释,处理条件编译,最终生成一个“纯代码”的 .i 文件(扩展名通常为 .ii 或 .i)。
✅ 中间结果
- 输出文件:.i 或 .ii 文件(纯 C++ 代码,无宏、无 #include)
- 内容:所有头文件被展开,宏被替换,条件编译已确定。
✅ GCC 命令
g++ -E -std=c++11 hello.cpp -o hello.i
- -E:只进行预处理,不编译。
- -std=c++11:启用 C++11 标准支持(关键参数)。
- hello.cpp:输入源文件。
- -o hello.i:输出预处理后的文件。
📌 注意:-std=c++11 在预处理阶段主要用于宏定义(如 __cplusplus 的值),但对语法无影响。
阶段二:编译 (Compilation)
✅ 目的
将预处理后的 C++ 代码(.i 文件)翻译为 目标平台的汇编语言。
✅ 实现原理
这是最复杂的阶段,包括:
- 词法分析 (Lexical Analysis):将字符流分解为 token(如 int, +, {)。
- 语法分析 (Parsing):根据 C++ 语法规则(C++11 语法)构建 抽象语法树 (AST)