10

如果我使用 c89 和 c99 编译以下程序有区别吗?我得到相同的输出。两者真的有区别吗?

#include <stdio.h>

    int main ()
    {
      // Print string to screen.
      printf ("Hello World\n");
    }

gcc -o helloworld -std=c99 helloworld.c 
vs
gcc -o helloworld -std=c89 helloworld.c 
4

3 回答 3

28
  • //注释不是 C89 的一部分,但在 C99 中是可以的,
  • main()在不返回任何值的情况下脱落与return 0;C99 中的等价,但在 C89 中则不然。来自N1256 (pdf),5.1.2.2.3p1:

    如果main函数的返回类型是与 兼容的类型int,则从初始调用到主函数的返回等效于以exit函数返回的值main作为参数调用该函数;到达}终止main函数的返回值 0。

因此,您的代码在 C89 中具有未定义的行为,而在 C99 中具有明确定义的行为。

于 2010-02-16T05:56:49.683 回答
6

从理论上讲,应该有一个区别。使用“//”来标记注释不是 C89 的一部分,因此如果它正确执行 C89 规则,则会产生编译器错误(使用 -ansi -pedantic,它可能会这样做,但我不记得当然)。

不过,这给出了一般特征的概念:如果程序编译为 C89,它通常也会编译为 C99,并给出完全相同的结果。C99 主要为您购买了一些 C89 中不存在的新功能,因此您可以使用(例如)C89 中不允许的可变长度数组。

您可能不得不要求执行迂腐的规则才能看到所有差异——C99 旨在标准化现有实践,并且一些现有实践是 gcc 扩展,其中一些默认启用。

于 2010-02-16T05:44:02.360 回答
2

在这个论坛http://www.velocityreviews.com/forums/t287495-p2-iso-c89-and-iso-c99.html我发现了这个:

总结:99 是标准化的,有新的关键字、新的数组内容、复数、库函数等。更多的编译器是 c89 完整的,因为他们有这么多时间来完成它们。

A) ANSI X3.159-1989。这是 1989 年 12 月的原始 1989 C 标准,带有基本原理。语言的主体在第 3 节中描述,“C 库”——stdio、函数等——在第 4 节中描述。

B) ISO 9899:1990。这是最初的 ISO C 标准。“ANSI”是美国国家标准协会,因此国际人群必须有自己的标准,有自己的、不同的编号系统。他们简单地采用了 ANSI 的 1989 标准,删除了基本原理,并对这些部分重新编号(改为将它们称为“条款”)。除了极少数例外,您可以只添加三个,因此大部分语言都在第 7 节中描述——呃,“子句”——6 和“C 库”部分。

C) ISO 9899:1999。这是新奇的“C99”标准,具有可变长度数组、灵活数组成员、“restrict”和“_Bool”等新关键字、“static”关键字的新语义、创建匿名聚合的新语法、新复数类型,数百个新的库函数,等等。

新的 ISO 标准立即被 ANSI “反向采用”。我没有看到任何官方的“ANSI 认可”声明,但考虑到通常的编号系统,我希望这是 ANSI 标准号 X3.159-1999。(编号系统非常明显:标准一经推出,就会获得一个编号——X. 代表 ANSI,或者只是一个数字代表 ISO——以及一个表示出版年份的后缀。对现有标准的更新会重用数字,与新年。)

尽管 X3.159-1989 和 9899:1990 有不同的年份和章节编号,但它们实际上是相同的,因此“C89”和“C90”实际上指的是同一种语言。因此,你可以说“C89”或“C90”,意思是一样的,即使对那些知道所有细微之处的人来说也是如此。

对最初的 1990 年 ISO 标准也有几个小的修订:“规范性附录 1”和两个“技术勘误”(编号;给出技术勘误 1 和 TC2)。这两个 TC 被认为是针对标准措辞中的故障的“错误修复”,而 NA1 是实际的“更改”。在实践中,TC 并没有真正影响到用户,而 NA1 增加了一系列人们可以使用的功能,所以 NA1 确实更重要。NA1 于 1994 年问世,因此可以将“经 NA1 修改的 ISO 9899:1990”称为“C94”。我也见过它叫“C95”。

于 2010-02-16T05:45:54.353 回答