>a>>b; cout,c++,compilation,c-preprocessor,static-linking,dynamic-linking,C++,Compilation,C Preprocessor,Static Linking,Dynamic Linking" /> >a>>b; cout,c++,compilation,c-preprocessor,static-linking,dynamic-linking,C++,Compilation,C Preprocessor,Static Linking,Dynamic Linking" />

用简单的c++;程序 我试图理解一个简单的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(); } #包括 #包括 #包括 #定义和(a,b)a+b INTA; void main() { int b; cin>>a>>b; cout

用简单的c++;程序 我试图理解一个简单的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(); } #包括 #包括 #包括 #定义和(a,b)a+b INTA; void main() { int b; cin>>a>>b; cout,c++,compilation,c-preprocessor,static-linking,dynamic-linking,C++,Compilation,C Preprocessor,Static Linking,Dynamic Linking,一般来说,这是一个非常广泛的问题,但我会尽量简短地回答。 典型的语言处理系统有以下几个阶段: 1.预处理阶段-在此阶段,处理所有预处理器和宏,并生成与之无关的代码。这包括用宏体替换宏调用,用实际参数替换形式参数 2.编译阶段-这有几个较小的阶段,例如: 词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等。 编译阶段可能/可能不会生成汇编代码。这两种方法有各自的优缺点。我们假设汇编代码是在本次讨论中生成的 3.汇编阶段-汇编程序将编译器的输出转换为目标代码。汇编程序本质上可以是一

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

1.预处理阶段-在此阶段,处理所有预处理器和宏,并生成与之无关的代码。这包括用宏体替换宏调用,用实际参数替换形式参数

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

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


4.链接阶段-生成的代码有许多对其他模块中定义的子程序的引用和调用。这些模块在此阶段链接到代码,并且地址分配给具有外部引用的指令

5.加载阶段-在该阶段,前一阶段产生的所有段被加载到RAM中,以便实际执行,控制被传递到第一条指令

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


有DM Dhamdere、Tannenbaum和Alfred Aho等作者撰写的关于这些主题的书籍非常有用。

基本正确。但是,局部变量在编译后会消失,不会参与链接,链接与头文件无关。@lilisten所以我假设pow()的定义函数是在静态链接步骤中添加的,是否错误?没有错误,但与头文件无关。使用
nm
命令查看
.o
文件。“产生的代码有许多对其他模块中定义的子程序的引用和调用。这些模块在此阶段与代码链接,地址分配给具有外部引用的指令“---但在动态链接的情况下,这是不必要的。这是在程序执行期间完成的。这是正确的吗?是的,你可以这么说。有静态绑定、运行时绑定和即时绑定技术。正如我所说的,有许多复杂的部分和子部分,这是针对一般情况的。