ANSI C和K&R C之间的主要区别是什么?
ANSI C上的Wikipedia文章说:
One of the aims of the ANSI C standardization process was to produce a superset of K&R C (the first published standard), incorporating many of the unofficial features subsequently introduced. However, the standards committee also included several new features, such as function prototypes (borrowed from the C++ programming language), and a more capable preprocessor. The syntax for parameter declarations was also changed to reflect the C++ style.
这使我认为存在差异。但是,我没有看到K&R C和ANSI C之间的比较。是否有这样的文档?如果没有,主要区别是什么?
编辑:我相信K&R书的封面上写着" ANSI C"。至少我相信我在家中拥有的版本。所以也许不再有区别了?
解决方案
回答
我认为最大的不同是函数原型和描述函数参数类型的语法。
回答
两者之间有一些细微的差异,但我认为K&R的更高版本适用于ANSI C,因此不再存在真正的差异。
由于缺少更好的术语," C Classic"的功能定义方式略有不同,即
int f( p, q, r ) int p, float q, double r; { // Code goes here }
我相信另一个区别是功能原型。原型实际上并不需要接受参数或者类型的列表。在ANSI C中可以。
回答
关于" K&R C"是什么,这里可能会有一些混淆。该术语指的是" C编程语言"第一版中记录的语言。粗略地说:贝尔实验室C编译器的输入语言是在1978年左右。
Kernighan和Ritchie参与了ANSI标准化过程。 " ANSI C"方言取代" K&R C",随后的" C编程语言"版本采用ANSI约定。 " K&R C"是一种"死语言",除非某些编译器仍接受旧代码。
回答
函数原型是K&R C和C89之间最明显的变化,但还有很多。标准化C库也进行了大量重要工作。即使标准C库是对现有实践的整理,它也对多种现有实践进行了整理,这使它变得更加困难。 P.J. Plauger的书《标准C库》是一本很好的参考书,还讲述了为什么该库以这种方式结束的幕后细节。
ANSI / ISO标准C在大多数方面与K&R C非常相似。预期大多数现有的C代码应在ANSI编译器上构建,而无需进行很多更改。但至关重要的是,在标准前时代,每种编译器供应商都可以解释该语言的语义。 ANSI C引入了对语言语义的通用描述,使所有编译器处于平等的地位。大约20年后的今天,这很容易理所当然,但这是一项重大成就。
在大多数情况下,如果我们没有要维护的标准C代码库,那么我们不必担心就可以感到高兴。如果我们这样做了-或者更糟糕的是,如果我们想将旧程序提高到更现代的标准-那么我们会感到同情。
回答
另一个区别是不需要定义函数返回类型和参数类型。它们将被假定为整数。
f(x) { return x + 1; }
和
int f(x) int x; { return x + 1; }
都是一样的
回答
区别在于:
- 原型
- 广泛的角色支持和国际化
- 支持const和volatile关键字
- 允许将函数指针用作取消引用