源程序的结构、编译与链接

结构

源代码的结构主要可以包括三部分:头文件与编译指令,辅助函数定义以及主函数定义。详见以下代码:

//头文件与编译指令
#include<iostream>
using namespace std;
//辅助函数定义
int addInt(int a, int b){
	return a+b;
}
//主函数定义
int main(){
	cout<< addInt(2+3);
	return 0;
}

编译、链接

任何一种计算机语言要从某种人们容易理解的形式(源代码)转化成计算机能执行的机器指令,都需要某种特定的翻译器。通常,这种翻译器分为两类:解释器(interpreter)和编译器(compiler)。
解释器将源代码转化成一些动作(机器指令)并立即执行,即一次翻译和执行一次,之后把这一行的解释丢掉,使用这种机制的语言也被称为脚本语言。而编译器则直接把所有源代码都转化成汇编或机器指令,最终生成可执行性的文件。
c/c++语言属于后者,从源程序到可执行程序,相关的过程大致可分为:

  • 预处理指令
    • 以#开头,表示导入库文件以及定义宏等
  • 编译器编译
    • 第一遍编译对预处理过的代码进行语法分析,将其解析为语法分析树的结构,并执行语法分析和静态类型检查(主要检查语法、函数与变量的声明是否正确)
    • 第二遍由代码生成器遍历语法分析树,把树的每个节点转换为汇编语言或机器代码,生成目标模块(.o或者.obj文件)
  • 链接器链接
    • 把一组目标模块链接为可执行程序,使得操作系统可以执行它
    • 处理目标模块中的函数或变量引用,必要时搜索库文件处理所有的引用

不难看出,特别是对多文件编译时,外部函数的声明(一般声明在头文件中,可以对同一个函数有多次声明)只是令程序顺利通过编译,此时并不需要搜索到外部函数的实现(或定义),而在链接过程中,外部函数的实现(或定义)才会被寻找和添加进程序,一旦没有找到函数实现,就无法成功链接
因此,在头文件中最好不要放进全局变量的定义和函数的实现,否则,在多个包含了此头文件的源程序链接时会因为重复定义或多个函数实现而出现错误。

变量的声明与定义

上面所讲在头文件中只放入函数的声明而不进行定义很好理解,那么对于需要在头文件中的全局变量,又应该如何进行声明?
变量的声明需要使用extern关键字,如下:

int a=0; //变量的定义并初始化
int b;  //变量的定义
extern int x; //变量的声明
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值