C89 vs c99 GCC编译器

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

#include  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 

  • //注释不是C89的一部分,但在C99中可以,
  • main()删除而不返回任何值相当于return 0; 在C99中,但在C89中却不是这样。 从N1256 (pdf),5.1.2.2.3p1:

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

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

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

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

您可能不得不要求迂腐规则执行以查看所有差异 – C99旨在标准化现有做法,并且一些现有做法是gcc扩展,其中一些默认启用。

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

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

A)ANSI X3.159-1989。 这是1989年12月的原始1989 C标准,与Rationale一起使用。 该部分的主体在第3节中描述,“C库” – stdio,函数等在第4节中描述。

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

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

新的ISO标准立即被ANSI“收回”。 我没有看到任何关于此的官方“ANSI认可”声明,但鉴于通常的编号系统,我希望这是ANSI标准号X3.159-1999。 (编号系统非常明显:一个标准,一旦出来,就会得到一个数字 – 对于ANSI来说是X.或者只是一个ISO的数字 – 以及一个表示发布年份的后缀。现有标准的更新重用了数字,新的一年。)

尽管X3.159-1989和9899:1990具有不同的年份和部分编号,但它们实际上是相同的,因此“C89”和“C90”实际上指的是相同的语言。 因此你可以说“C89”或“C90”并且意思相同,即使是那些意识到所有细微之处的人也是如此。

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