C89 vs c99 GCC编译器

时间:2010-02-16 05:38:09

标签: c gcc compiler-construction c99 c89

如果我使用c89 vs 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 

3 个答案:

答案 0 :(得分:27)

  • //评论不是C89的一部分,但在C99中可以,
  • main()下降而不返回任何值相当于C99中的return 0;,但在C89中则不然。从N1256(pdf),5.1.2.2.3p1:
      

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

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:1)

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

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

  

A)ANSI X3.159-1989。这是原始的1989 C标准,注明日期   1989年12月,与理由。语言的主体是   在第3节和“C库”中描述 - stdio,   功能,等等 - 见第4节。

     

B)ISO 9899:1990。这是最初的ISO C标准。 “ANSI”是   美国国家标准协会,所以国际人群都有   有自己的,不同的,编号的自己的标准   系统。他们简单地采用了ANSI的1989年标准,删除了   基本原理,重新编号(称之为“条款”)   代替)。除了极少数例外,您只需添加三个即可   部分描述了大部分语言    - 呃,“条款” - 6,以及第7节中的“C库”部分。

     

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

     

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

     

虽然X3.159-1989和9899:1990有不同的年份和部分   编号,它们实际上是相同的,所以“C89”和“C90”真的如此   指同一种语言。因此你可以说“C89”或“C90”   对于那些意识到所有细微之处的人来说,这意味着同样的事情。

     

原始的1990 ISO也有一些小的修改   标准:“规范附录1”和两个“技术勘误表”   (编号;给出技术勘误1和TC2)。这两个TC是   被认为是“错误修复”的措辞故障   标准,而NA1是一个实际的“变化”。实际上,技术委员会没有   真正影响用户,而NA1增加了一大堆功能   人们可以使用,所以NA1确实更重要。 NA1问世了   1994年,人们可能会将“ISO 9899:1990修改为NA1”作为   “C94”。我也看到它叫做“C95”。