根据简单的c ++程序编译过程

时间:2018-03-22 17:37:42

标签: c++ compilation c-preprocessor static-linking dynamic-linking

我试图用简单的c ++程序来理解编译过程如下:

#include<iostream.h>
#include<conio.h>
#include<math.h>

#define sum(a,b) a+b

int a;

void main()
{
int b;
cin>>a>>b;
cout<<"hello"<<endl;
cout<<pow(a,2)<<endl;
cout<<sum(a,b);
getch();
}

到目前为止我的理解:

1)预处理:扩展所有宏并替换表达式。例如: sum(a,b)。我们正在使用该程序的所有函数的函数原型被添加到代码中。例如:math.h的 pow()函数

2)编译:预处理的代码转换为汇编代码,然后转换为单个对象代码(这是机器语言)。

3)链接:决定如何将内存分配给代码的各个部分 - Global(int a)和局部变量(int b)。

在静态链接的情况下,各种头文件中的函数定义也会添加到代码中。例如:math.h中pow()的定义。最后生成一个独立的单个可执行文件。

如果是动态链接,则不会添加函数定义。最后生成一个单独的可执行文件,但它不是独立的。

我的理解错了吗?我错过了什么?

1 个答案:

答案 0 :(得分:2)

这是一个非常广泛的问题,但我会尝试尽可能简短地回答。 典型的语言处理系统有以下几个阶段:

<强> 1。预处理阶段 - 在此阶段,处理所有预处理器和宏,并生成不含这些预处理器和宏的代码。这涉及用宏体替换宏调用并用实际参数替换形式参数。

<强> 2。编译阶段 - 这有几个较小的阶段,例如:    词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等。 编译阶段可能会/可能不会生成汇编代码。两种方法都有各自的优点和缺点。我们假设汇编代码是在本次讨论中产生的。

第3。汇编阶段 - 汇编程序将编译器的输出转换为目标代码。汇编程序本质上可以是一遍或两遍。

<强> 4。链接阶段 - 已生成的代码具有许多引用和对其他模块中定义的子例程的调用。这些模块链接到此阶段的代码,地址分配给具有外部参考的指令。

<强> 5。加载阶段 - 在此阶段,将前一阶段生成的所有段加载到RAM中以进行实际执行,并将控制权传递给第一条指令。

本答案中列出的所有组件都有许多错综复杂的子部分,绝不是对语言处理器的完整解释。

作者DM Dhamdere,Tannenbaum和Alfred Aho等有关这些主题的书籍很有用。