1.8 编程机制
C语言编写程序时,编写的内容被存储在文本文件中,该文件被称为源代码文件(source code file)。大部分C系统都要求文件名以.c结尾。在文件名中,点号(.)前面的部分称为基本名(basename),点号后面的部分称为扩展名(extension)。
基本名和扩展名的组合就是文件名。文件名应该满足特定计算机系统的特殊要求。
#include
int main(void)
{
printf("Concrete contains gravel and cement.\n");
return 0;
}
/*输出:
*/
1.8.1 目标代码文件、可执行文件和库
典型的C实现通过编译和链接两个步骤来完成将源代码文件转换为可执行文件的这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。另外,链接器还将你编写的程序和预编译的库代码合并。
中间文件有多种形式。这里描述的是最普遍的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件(或简称目标文件)中。目标文件里面包含的是源代码的机器语言代码,不是一个完整的程序,因此并不能直接运行该文件。
目标代码文件缺失启动代码(startup code)。启动代码充当着程序和操作系统之间的接口。
目标代码文件还缺少库函数。几乎所有的C程序都要使用C标准库中的函数。目标代码文件并不包含库函数的代码,只是包含库函数的指令。库函数真正的代码存储在另一个称为库的文件中。库文件中有许多函数的目标代码。
链接器的作用是把你编写的目标代码、系统的标准启动代码和库代码这3部分合并成一个文件,即可执行文件。对于库代码,链接器只会把程序中要用到的库函数代码提取出来。
源代码---》编译器---》目标代码---》 链接器 ---》可执行代码
(库代码,启动代码)
简而言之,目标文件和可执行文件都由机器语言指令组成。然而,目标文件只包含编译器为你写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。
1.8.2 UNIX系统
C语言因UNIX系统而生,也因此而流行。
1.在UNIX系统上编辑
通用的UNIX编辑器。如emacs、jove、vi或X window System文本编辑器。
UNIX区分大小写。
/*
**inform.c
*/
#include
int main(void)
{
printf("A .c is used to end a C program filename.\n");
return 0;
}
源文件是整个编译过程的开始,不是结束。
/*输出:
*/
2.在UNIX系统上编译
以前,UNIX C编译器要调用定义的cc命令。但是,UNIX系统提供的C编译器通常来自一些其他源,然后以cc命令作为编译器的命名。
编译inform.c,要输入以下指令:
cc inform.c
如果编译器报告void的错误,说明你的系统未更新成ANSI C编译器,只需要删除void即可)。如果使用ls命令列出文件,会发现一个a.out文件。
输入源代码---》文本编辑器---》源代码(name.c)---》编译器---》可执行代码(a.out)---》输入文件名a.out运行该程序
如果要存储可执行文件(a.out),应该把它重命名。否则,该文件会被下一次编译程序时生成的新的a.out文件替换。
对于目标文件,C编译器会创建一个与源代码基本名相同的目标代码文件,但是其扩展名为.o。有时却找不到这个文件,是因为一旦链接器生成了完整的可执行程序,就会将其删除。如果原始程序有多个源代码文件,则保留目标代码文件。
1.8.3 GUN编译器集合和LLVM项目
GUN项目始于1987年,是一个开发大量自由UNIX软件的集合(GUN的意思是“GUN's Not UNIX”及GUN不是UNIX)。GUN编译器集合(也被称为GCC,其中包含GCC C编译器)是该项目的产品之一。用gcc命令便可调用GCC C编译器。
LLVM项目成为cc的另一个替代品。该项目是与编译器相关的开源软件集合,始于伊利诺伊大学2000年的研究项目。它的Clang编译器处理C代码,可以通过clang调用。
GUN和LLVM都可以使用-v选项来显示版本信息。
gcc和clang命令都可以根据不同的版本选择运行时选项来调用不同C标准。
gcc -std=c99 inform.c
gcc -std=c1x inform.c
gcc -std=c11 inform.c
1.8.4 Linux系统
Linux是一个开源、流行、类似于UNIX的操作系统,可在不同平台上运行。在Linux中准备C程序要使用GUN提供的GCC公共域C编译器。编译命令类似于:
gcc inform.c
欲详细了解GCC和最新发布的版本,请访问http://www.gnu.org/software/gcc/index.html。
1.8.5 PC的命令行编译器
C编译器不是标准Windows软件包的一部分,但可以从互联网免费下载Cygwin和MinGW,这样便可在PC上通过命令行使用GCC编译器。Borland的C++编译器5.5也可以免费下载,支持C90。
源代码文件应该是文本文件,而不是字处理器文件。
通常,C编译器生成的中间目标代码文件的扩展名是.obj(也可能是其他扩展名)。与UNIX编译器不同,这些编译器在完成编译后通过不会删除这些中间文件。有些编译器生成带.asm扩展名的汇编语言文件。
一些编译器在编译后会自动运行编译器,另一些要求用户手动运行编译器。
1.8.6 集成开发环境(Windows)
可以免费下载的集成开发环境(IDE)有:
Microsoft Visual Studio Express和Pelles C。利用集成开发环境可以快速开发C程序。
通常,Windows IDE既可以处理C也可处理C++,因此要指定待处理的程序是C还是C++。有些产品用.c来指明使用C而不是C++。当然,大多数C程序也可以作为C++程序运行。
你可能会遇到一个问题:在程序执行完毕后,执行程序的窗口立即消失。如果不希望出现这种情况,可以让程序暂停,直到按下Enter键,窗口才消失。可以在程序的最后(return这项代码之前)添加下面一行代码:
getchar();
有时根据程序的需要,可能还需要一个击键等待。这种情况下,必须要用两次getchar():
getchar();
getchar();
Microsoft Visual Studio和C标准
Microsoft Visual Studio机器免费版本Microsoft Visual Studio Express都久负盛名,它们与C标准的关系也很重要。然后,微软鼓励程序员从C转向C++和C#。
1.8.7 Windows/Linux
许多Linux发行版都可以安装在Windows系统中,以创建双系统。可以在Windows系统中运行Linux程序,或者Linux系统中运行Windows程序。不能通过Windows系统访问Linux文件,但是可以通过Linux系统访问Windows文档。
1.8.8 Macintosh中的C
目前,苹果免费提供Xcode开发系统下载。
Mac OS X建立在UNIX系统之上,终端工具打开的窗口是让用户在UNIX命令行运行程序。
1.11 本章小结
C是强大而简洁的编程语言。它之所以流行,在于自身提供大量的实用编程工具,能很好地控制硬件。而且,与大多数其他程序相比,C程序更容易从一个系统移植到另一个系统。
C是编译型语言。C编译器和链接器是把C语言源代码转换为可执行代码的程序。