【问题标题】:C89 vs c99 GCC compilerC89 与 c99 GCC 编译器
【发布时间】:2011-01-17 06:33:13
【问题描述】:

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

【问题讨论】:

  • "gcc -std=c89" 和 "gcc -std=c99" 不完全符合各自的标准。添加“-pedantic”或“-pedantic-errors”以获得接近完全一致性的内容。

标签: c gcc compiler-construction c99 c89


【解决方案1】:
  • // cmets 不是 C89 的一部分,但在 C99 中是可以的,
  • main() 脱落而不返回任何值相当于C99 中的return 0;,但在C89 中则不然。来自N1256 (pdf),5.1.2.2.3p1:

    如果main函数的返回类型是与int兼容的类型,则初始调用main函数的返回相当于用main返回的值调用exit函数函数作为它的参数;到达终止main 函数的} 返回值0。

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

【讨论】:

    【解决方案2】:

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

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

    您可能不得不要求执行迂腐的规则才能看到所有差异 - C99 旨在标准化现有实践,并且一些现有实践是 gcc 扩展,其中一些默认启用。

    【讨论】:

    • +1,很好的收获; // cmets 可能是 C99 中唯一值得一试的部分。 -ansi -pedantic 确实出现了错误:main.c:5: error: expected expression before '/' token
    • 我看不出// cmets 有什么用处,它只是少了两个字符......这就像说C 应该使用. 来访问指向结构的指针的成员而不是-&gt; 因为它节省了打字。
    • @JoeD // cmets 只捕获一条线,这意味着它们不太可能无意中被另一组 cmets 捕获或导致问题。此外,您关于. 的论点有点愚蠢。对基本相同的操作使用相同的运算符可能是个好主意。
    【解决方案3】:

    在这个论坛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 标准,去掉了 基本原理,并对章节重新编号(称它们为“条款” 反而)。除了极少数例外,您只需添加三个,这样 大部分语言在章节中描述 -- er, "clause" -- 6,以及第 7 节中的 "C library" 部分。

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

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

    虽然 X3.159-1989 和 9899:1990 有不同的年份和部分 编号,它们实际上是相同的,所以“C89”和“C90”真的 指同一种语言。因此,您可以说“C89”或“C90” 意思是一样的,即使对于那些知道所有微妙之处的人来说也是如此。

    对 1990 年的原始 ISO 也进行了几处小修订 标准:“规范性附录 1”和两个“技术勘误” (编号;给出技术勘误 1 和 TC2)。这两个TC是 被认为是对措辞中的故障的“错误修复” 标准,而 NA1 是实际的“变化”。在实践中,TC 不 真正影响用户,而 NA1 添加了一系列功能, 人家可以用,所以NA1确实比较显着。 NA1出来了 1994 年,因此可以将“经 NA1 修改的 ISO 9899:1990”称为 “C94”。我也见过它叫“C95”。

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 2013-07-28
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多