编程机制
编写程序时必须遵循确切步骤主要是取决于你的计算机环境。因为 C语言是可以移植的,所以它在许多环境中可用,其中包括 UNIX,Linux,Windows等等 。
不过,让我们首先来看一看许多环境所共有的一些方面。你完全不必知道运行一个 C 程序后面的事情,但了解一点是一个很好的背景知识。它还可以帮助你理解为什么编写一个 C 程序必须经过一些特定步骤。
用 C 语言编写一个程序时,你将编写的内容保存在一个被称为源代码文件的文本文件中。大多数 的系统,都需要该文件的名称以 .c 结尾。
例如,hello world.c 。名称中小点前的部分被称为基本名,小点后的部分被称为扩展名。因此,hello world是一个基本名,c 是一个扩展名。组合在一起的 hello world.c是文件名。
这样,在我们提到名称时内容就可以更具体,我们假定有一个名为 helloworld.c的源文件,其源代码如下面所示。
------------------------------------------------------
#include
int main ()
{
printf("hello world! ");
return 0;
}
------------------------------------------------------
目标代码文件、可执行文件和库
C语言编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行机器语言代码。
它分两步完成这一工作:编译和链接。编译器将源代码转换为中间代码,链接器将此中间代码与其他代码相结合生成可执行文件。
C 使用被划分为两部分的这一方法使程序便于模块化。你可分别编译各个模块,然后使用链接器将编译过的模块结合起来。这样,如果需要改变一个模块,则不必重新编译所有其他的模块。同时,链接器将你的程序与预编译的库代码结合起来。
中间文件的形式有多种选择。最一般的选择,同时也是我们这里讲述的实现方式所采取的选择,是将源代码转换为机器语言代码,将结果放置在一个目标代码文件中。虽然目标文件包含机器语言代码,但该文件还不能运行。目标文件包含源代码的转换结果,但它还不是一个完整的程序。
目标代码文件中所缺少的第一个元素是一种叫做启动代码(start-up code)的东西,此代码相当于你的程序和操作系统之间的接口。
例如,你可以在DOS或Linux下运行一个 IBM PC兼容机,在两种情况中硬件是相同的,所以会使用同样的目标代码,但DOS与Linux要使用不同的启动代码,因为这两种系统处理程序的方式是不同的。
所缺少的第二个元素是库例程的代码。几乎所有C程序都利用标准C库中所包含的例程(称为函数)。例如,前面的 concrete.c 使用了函数 printf()。目标代码文件不包含这一函数的代码,它只包含声明使用 printf()函数的指令。实际代码存储在另一个称为“库”的文件中。库文件中包含许多函数的目标代码。
链接器的作用是将【目标代码】、【系统的标准启动代码】和【库代码】这3个元素结合在一起,并将它们存放在单个文件,即可执行文件中。对库代码来说,链接器只从库中提取你所使用的函数所需要的代码,如下图中的简单示例:
简而言之,目标文件和可执行文件都是由机器语言指令组成的。但目标文件只包含你所编写的代码转换成的机器语言,而可执行文件还包含你所使用的库例程以及启动代码的机器代码。
Windows系统的集成开发环境
因为 C 编译器不是标准 Windows 包的一部分,所以需要获得并安装一个 C 编译器。许多厂商都会提供基于 Windows的集成开发环境(IDE) 。
所有编译器都具有用来装配C程序的快速,集成的开发环境。关键的一点是,它们都具有内置的编辑器,可用来编写C程序。这类开发环境一般都提供了让你可以命名和保存源代码文件的菜单,以及让你可以不离开IDE就能编译和运行程序的菜单。
如果编译器发现任何错误,会返回到编辑器中,而且编辑器可以标出有问题的行,并将它们与相应的错误消息匹配起来,例如VC6.0、QT、Visual Studio(简称vs)。
Windows IDE最初可能让人有一点望而生畏,因为它们提供多种目标,也就是说,提供了多种可让程序在其中运行的环境。
例如,它们可能提供16位Windows程序,32位Windows程序,动态链接库文件(DLL)等等让你选择。许多目标都需要引入Windows图形界面的支持。
为了管理这些选项,通常需要创建一个项目,以便随后向其中添加将要使用的源代码文件名。一般来说,首先使用文件菜单来创建一个新的项目。重要的是选取正确的项目形式。本书中的例子是一般性的例子,设计目的是在一个简单的命令行环境中运行。
因为 Widnows IDE一般可处理 C 和 C++,所以你应该指明你需要一个C程序。在某些产品,可以使用项目类型来指明希望使用 C。而在其他一些产品,如 Microsoft Visual C++中,可以使用.c文件扩展名来指明希望使用 C 而不是 C++。然而,大多数 C 程序也可以作为 C++程序运行。
可能大家在写完一个程序之后会遇到一个问题:显示程序执行的窗口在程序终止时突然消失,也就是程序运行后窗口一闪而过。如果遇到这种情况,那么可以使程序暂停,直到按下 Enter键。要做到这一点,请在程序的末尾,恰好在 return 语句之前,添加下面的一行:
getchar();
该行读取一次按键,因此程序将暂停直到按下 Enter 键时。有时,根据程序函数的需要,可能已经有一个等待按键的指令。在这种情况下,需要使用 getchar()两次:
getchar();
getchar();
例如,如果程序最后做的事情是请你输入你的体重,那么就应当键入你的体重并按 Enter 键以输入数据。程序将读取体重,第1个getchar()将读取 Enter键,第2个getchar()将导致程序暂停,直到再次按下 Enter键。如果现在你对此还不太理解,那么在学习更多关于 C 输入的知识后你就明白了。
虽然各种IDE都有许多共同的原则,但在细节方面会因产品而异,而在一个产品系列中,又会因版本而异。你必须要经过一些实践,才能知道编译器的正确工作方式。
语言标准
目前,有许多 C 实现方式可用。理想情况下,编写 C 程序时,假如该程序末使用机器特定的编程技能,则它在任何实现方式中的运行应该是相同的。要在实践中做到这一点,不同的实现方式需要遵守一个公认的标准。
首先说明一点,C语言并没有官方的标准。不过,Brian Kernighan 和 Dennis Ritchie 编写的 The C Programming Language 第1版(1978)成为大家接受的标准,通常称为 K&R C 或经典 C。
特别是这本书附录中的“C Reference Manual”已成为 C 实现的指南。例如,编译器都会声明它可提供一个完整的 K&R 实现。然而,虽然该附录定义了 C 语言,但是却没有定义 C 库。
因为 C 比大多数其他语言更加依赖库,所以还需要一个库标准。因为缺乏任何官方标准,所以提供 UNIX 实现的库成为一个事实上的标准。
第1个 ANSI/ISO C 标准
随着 C语言的发展和更加广泛地用于更多种类的系统上,使用 C 的群体意识到它需要一个更加全面,新颖和严格的标准。为了满足这一要求,美国国家标准代组织(ANSI)在1983年设立了一个委员会以发展一个新的标准,该标准于1989年正式采用。
这个新标准(ANSI C)定义了语言和一个标准 C 库。国标标准化组织于1990年采用一个 C 标准 (ISO C )。ISO C 和 ANSI C 实质上是同一个标准。
ANSI/ISO标准最终版本通常被称为 C89 (因为 ANSI于1989年批准了该标准) 或 C90(因为 ISO 于1990年批准了该标准)。然而,因为 ANSI版本是首先出现的,所以人们通常使用ANSI C这一术语。
C99标准
1994年,修订标准的工作开始了,这一努力的结果是产生了 C99标准。一个联合 ANSI/ISO委员会签署了 C90标准的最初原则,包括保持言语短小而简单。
他们的意图不是为语言添加新的特性,而是为了满足新的目标。新目标之一是支持国际化编程,例如,提供了处理国际字符集的方法。第二个目标是“整理现有的惯例以解决明显的缺点”。
因此,在遇到需要将 C 移植到 64 位处理器时,委员会根据在真实生活中处理问题的人的经验来添加标准。第三个目标是针对科学和工程项目的重要数字计算改进 C 的适应能力。
国际化,修正其不足和改进计算的实用性这三点是主要的面向改变的目标。形成在关于更改的计划在性质上更加保守,例如,让与 C90 和 C++ 的不兼容性达到最小,让语言在概念上保持简单。肩带来说就是希望 C++成为重要的和强有力的语言。
结果是 C99 的修改保持了 C 的本质特性,C 继续是一种简短,清楚,高效的语言。本书指出了 C99中的许多修改。因为目前大多数编译器没有完全实现所有 C99的修改,所以你可以会发现一些修改在你的系统上不可用。或者你可能会发现,只有修改编译器的设置以后,才能够看到一些 C99 的特性。
总结
C 是一种强大,简洁的编程语言。之所以流行是因为它提供了有用的编程工具和对硬件良好的控制,还因为 C 程序在从一个系统向另一个系统移植方面比大多数程序更容易。C 是一种需要编译的语言。C 编译器和链接器是将 C 语言源代码转换成可执行代码的程序。
用 C 编程可能很费力,困难并让你感到灰心,但这一工作也可能让你着迷,兴奋和感到满意。
看到这里是不是又有很多感悟了呢~
如果你很想学会编程,那么小编推荐我专栏的C语言/C++编程学习基地【点击进入】!
都是学编程小伙伴们,带你入个门还是简简单单啦,一起学习,一起加油~
还有许多学习资料和视频,相信你会喜欢的!
涉及:游戏开发、常用软件开发、编程基础知识、课程设计、黑客等等......