C89 与 c99 GCC 编译器
如果我使用 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
Is there a difference if I compile the following program using c89 vs c99? I get the same output. Is there really a difference between the two?
#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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
//
注释不是 C89 的一部分,但在 C99 中可以,main()
脱离而不返回任何值相当于return 0;
code> 在 C99 中,但在 C89 中则不然。来自 N1256 (pdf),5.1.2.2 .3p1:<块引用>
如果
main
函数的返回类型是与int
兼容的类型,则从初始调用main函数返回相当于调用exit
函数,以main
函数返回的值作为参数;到达终止main
函数的}
返回值 0。因此,您的代码在 C89 中具有未定义的行为,而在 C99 中具有明确定义的行为。
//
comments are not a part of C89 but are OK in C99,main()
without returning any value is equivalent toreturn 0;
in C99, but not so in C89. From N1256 (pdf), 5.1.2.2.3p1:So your code has undefined behavior in C89, and well-defined behavior in C99.
理论上应该是有区别的。使用“//”来标记注释不是 C89 的一部分,因此如果它正确执行 C89 规则,则会产生编译器错误(使用 -ansi -pedantic,它可能会这样做,但我不记得了当然)。
不过,这给出了一般特征的想法:如果一个程序编译为 C89,它通常也会编译为 C99,并给出完全相同的结果。 C99 主要为您提供了一些 C89 中不存在的新功能,因此您可以使用(例如)可变长度数组,这在 C89 中是不允许的。
您可能需要要求执行迂腐的规则才能看到所有差异 - C99 旨在标准化现有实践,并且一些现有实践是 gcc 扩展,其中一些默认情况下启用。
In theory, there should be one difference. Using "//" to demark a comment isn't part of C89, so if it enforced the C89 rules correctly, that would produce a compiler error (with -ansi -pedantic, it might do that, but I don't remember for sure).
That gives an idea of the general character though: if a program compiles as C89, it'll generally also compile as C99, and give exactly the same results. C99 mostly buys you some new features that aren't present in C89, so you can use (for example) variable length arrays, which aren't allowed in C89.
You may have to ask for pedantic rules enforcement to see all the differences though -- C99 is intended to standardize existing practice, and some of the existing practice is gcc extensions, some of which are enabled by default.
在这个论坛上 http://www.velocityreviews .com/forums/t287495-p2-iso-c89-and-iso-c99.html 我发现了这个:
摘要:99 是标准化的,有新的关键字、新的数组内容、复数、库函数等等。更多的编译器已经完成了 c89,因为他们有足够的时间来完成它们。
on this forum http://www.velocityreviews.com/forums/t287495-p2-iso-c89-and-iso-c99.html i found this:
summary: 99 is standardized, has new keywords, new array stuff, complex numbers, library functions and such. More compilers are c89 complete since they've had all this time to make them so.