一个C++源文件从文本到可执行文件经历的过程
以我们最初学到的“hello world”程序为例。这个程序在编译中是这样进行的,首先执行g++ helloworld.cpp命令得到a.out文件;执行./a.out命令就可以输出hello world!事实上执行g++ helloworld.cpp可以分为四个步骤,分别是预处理,编译,汇编,和链接,这就像一个被隐藏的过程,使用者可以通过简单的命令即可完成复杂的步骤。
一、预处理(产生.i文件,-E)
首先是源代码文件helloworld.cpp和相关头文件预处理成一个.i文件。命令如下g++ -E helloworld.cpp -o helloworld.i
预处理的过程主要处理那些源代码文件中只能够以“#”开始的预处理指令,主要规则如下:
-
将所以#define删除,并将宏定义展开。
-
处理一些条件预编译指令如#ifndef,#ifdef,#elif,#else,#endif等。将不必要的代码过滤掉。
-
处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。这个过程是递归进行的,因为被包含的文件可能也包含其他文件。
-
预处理过程还会过滤掉所有注释/**/和//里面的内容。
-
另外还会添加行号和文件名标识。
-
最后会保留#pragma编译器指令,因为编译器需要使用它们。
1、面试题—>#ifndef,#ifdef,#endif的作用?
防止重复包含头文件。
2、面试题—>#include尖括号和双引号的区别?
-
#include<> ,从标准库中寻找头文件。
-
#include"",从当前目录开始寻找头文件。
二、编译(产生.s文件,-s)
编译就是将预处理的文件进行一系列的词法分析,语法分析,语义分析,以及优化后产生相应的汇编代码文件,这个过程是程序构建的核心部分,也是最复杂的。执行命令(-s)如下:
g++ -S helloworld.i -o helloworld.s
class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
评论记录:
回复评论: