C语言智者指南
——不能再忍受被称为傻瓜?

关于历史的只言片语,ANSI和ISO

C语言成长自AT&T贝尔实验室相当长期的努力。第一本关于C的书,由Brian W. Kernighan和Dennis M. Ritchie撰写的《C程序设计语言》,在1978年第一次出版。这本书常以其作者姓名的首字母被称作‘K&R’,或者‘白皮书’,隐指封面的多余空白。那时C语言已经在一定的圈子中相当流行,并且在白皮书出版后更快传播。在1980年代早期,美国国家标准协会成立了一个委员会(X3.159)对C语言进行标准化。该委员会添加了一些特性,并作了一些打破现有程序的‘安静的修改’,但总的来说相当接近最初的语言。

第一个ANSI C标准在1989年12月出版,被编号为X3.159-1989。国际标准化组织(ISO)只做了一些编辑上的更改并给了一个新编号ISO 9899:1990,立即采用了ANSI C标准。这一版本的C因此被不同地称作‘ANSI C’或‘ISO C’。更早的版本常被称为‘K&R C’或‘白皮书C’,或者——在第二版更新后——用‘K&R-1 C’指白皮书的第一版。

在1990年代,ANSI和ISO着手更新标准,产生了‘标准化附录’和最终的新标准ISO 9899:1999。按照已有惯例,它自动代替X3.159-1989成为X3.159-1999。这表示事实上有两个版本的ANSI/ISO C。本文中我使用名字‘C89’指旧标准(很多人用‘C90’),以及用‘C99’指新标准(这里仅相差一个年代编号)。

本文大部分关注C89。

标准?我们不需要任何标准!

嗯,或许你真的要这样。它实在是一个关于你想做什么的问题。

标准——两者其中之一——不是全部C的终点。然而,编写‘严格符合标准’的C代码,有极大的优点。C标准在本质上是你——一个编写C代码的程序员——和提供C编译器和库的实现者之间的约定。这个约定说,实现者必须坚守他的约定,只要你也坚持你的。在你违反约定的那一刻,实现者也能随意违反他的。

实际上,这表示你编写的任何严格符合标准的代码,能在任何一个编译器上工作。(一个编译器不能声称自己是一个‘C编译器’,除非它实现标准C。并不存在有标准警察,会把实现者拖到监狱里去,但事实上,如果你编写的代码不能正确运行,有人因此受到伤害并把你告上法庭。你需要承担的法律责任在某种程度上,可能取决于你是否遵循了‘公认的行业惯例’。如果法庭裁决,那些惯例包括尽可能地按照标准C编程,一个关键的法律要点——决定是否是因为你‘疏忽大意’——从措辞的法律意义来说——依赖于你是否按照标准C编程。当然简单地追随标准C可能并不够,并且在一场法庭讼案中有许多变数,但如果能说‘我在工作中遵守了公认行业标准和惯例’,在此类型诉讼中有直接的法律利益。请注意这里并不是要成为法律建议;我不是一个律师;我听他们这样说过。) 这也常常表示你能改变编译器甚至机器。如果你编写一个程序到一半时,你的老板过来说‘Q型计算机作废了,我们现在会买R型机器’,并且你编写Q关联的代码,你将必须全部重写它。如果你编写标准C代码,它能全部在R模型上工作。

标准C非常有限。它没有联网,没有图形,没有鼠标支持;它不能启动进程,打印,等等。但是它能做很多事情——并且如果你分解不管你写的什么程序,为‘可移植的’和‘不可移植的’两部分,你将不需要重写可移植的那部分。如果你需要在网络上启动一个进程,把那个任务放在一个单独的文件中的一个单独的函数中。按需要为每个不同的系统提供一个不同的函数(和文件)。你的程序将仍然需要网络和进程扩展,但现在你将只需要在每次迁移程序时,重写‘启动网络进程’函数。

基础


(This Chinese translation isn't confirmed by the author, and it isn't for profits.)

Translator : jhlicc@gmai1.c0m
Origin : http://www.torek.net/torek/c/index.html