C89 vs c99 GCC编译器

use*_*514 9 c compiler-construction gcc 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 
Run Code Online (Sandbox Code Playgroud)

Alo*_*hal 28

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

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

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


Jer*_*fin 6

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

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

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

  • +1,好抓; `//`评论可能是C99值得参与的唯一部分.`-ansi -pedantic`确实出现错误:`main.c:5:错误:'/'标记之前的预期表达式 (2认同)