gcc和g++的区别
GCC,全称GNU Compile Collection,也就是一个编译套装。通常来看,gcc是用来编译C的,g++是用来编译C++的。从用法上来看这是没错的,但这种认识是比较片面的。
需要认识到的第一个原理是,g++最终调用的还是gcc,换句话说,gcc才是最终的编译器。
接下来从三个方面来讲述两者的区别:
- 对待源文件(编译阶段),
gcc对待.c文件将其当作C程序,对待.cpp文件将其当作C++程序;g++对待.c和.cpp文件一律当作C++程序处理 - 链接标准库(链接阶段),
gcc默认只会连接到标准C库;g++可以自动连接到标准C库和标准C++库。但是gcc可以用-l参数添加C++标准库,像这样-lstdc++,这样的话gcc也可以编译C++了。 - 关于
__cpluscplus宏定义。gcc会根据源文件后缀名去判断是否要定义这个宏;g++会直接定义这个宏,但是这并不影响它可以正常编译C程序
1 | gcc a.cpp -o a |
GCC 各阶段的实际程序
| 阶段 | 程序名称 | 描述 |
|---|---|---|
| 预处理器 | cpp |
C PreProcessor |
| 编译器 | cc1、cc1plus |
C/C++ 编译器前端 |
| 汇编器 | as |
GNU Assembler |
| 链接器 | ld |
GNU Linker |
1 | 分步执行 |
cpp 预处理器处理.c源文件在交给编译器之前所做的任务:
- 识别并递归处理预处理指令,比如
#include、#define等。其它无法识别的原样保留 - 保留特殊的预处理指令
#pragma,因为这个指令的具体执行效果由编译器决定 - 删除源代码中的注释内容
- 不进行语法检测
#include 实际搜索顺序
#include "header.h"- 当前源文件所在目录
-iquote指定的目录-I指定的目录- 系统头文件目录(如
/usr/include等)
#include <header>-I指定的目录- 系统头文件目录(如
/usr/include等)
C 标准并不强制规定具体路径列表,只规定语义差异:
#include "h"
→ 先在实现定义的位置查找(通常是当前文件目录),失败后再按<h>的规则查找#include <h>
→ 只在实现定义的系统头文件位置查找
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星の夜!
