如果我使用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
答案 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”。