C语言——编程机制

生成程序的具体过程因计算机环境而异。C是可移植性语言,因此可以在许多环境中使用。 

用C语言编写程序时,编写的内容被存储在文本文件中,该文件被称为源代码文件。大部分C系统,都要求文件名以 .c 结尾(如budget.c)。在文件名中,点号(.)前面的部分称为基本名,点号后面的部分称为扩展名。因此,budget是基本名,c是扩展名。基本名与扩展名的组合就是文件名。文件名应该满足特定计算机操作系统的特殊要求。例如,有些UNIX系统限制整个文件名(包括扩展名)不超过14个字符,而有些UNIX系统则允许使用更长的文件名,最多255个字符。Linux、Windows和Macintosh OS都允许使用长文件名。

看一个具体的应用,假设有一个名为xiaogu.c的源文件,其中的C源代码如下:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    printf("I am XiaoGu! I love C!\n");
    system("pause");    // 防止运行后自动退出,需头文件stdlib.h
    return 0;
}

目标代码文件、可执行文件和库 

C编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。典型的C实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。

中间文件有多种形式。我们在这里描述的是最普通的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件)。虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。因为目标文件中存储的是编译器翻译的源代码,这还不是一个完整的程序。

目标代码文件缺失启动代码。启动代码充当着程序和操作系统之间的接口。例如,可以在MS Windows或Linux系统下运行IBM PC兼容机。这两种情况所使用的硬件相同,所以目标代码相同,但是Windows和Linux所需的启动代码不同,因为这些系统处理程序的方式不同。

目标代码还缺少函数。几乎所有的C程序都要使用C标准库中的函数。例如,xiaogu.c中就使用了printf()函数。目标代码文件并不包含该函数的代码,它只包含了使用printf()函数的指令。printf()函数真正的代码存储在另一个被称为库的文件中。库文件中有许多函数的目标代码。

链接器的作用是,把你编写的目标代码、系统的标准启动代码和库代码这3部分合并成一个文件,即可执行文件。对于库代码,链接器只会把程序中要用到的库函数代码提取出来。

简而言之,目标文件和可执行文件都由机器语言指令组成的。然而,目标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。

扫描二维码关注公众号,回复: 15454600 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_51995147/article/details/128462413