C89 与 c99 GCC 编译器

问题描述 投票:0回答:3

如果我使用 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 
c gcc c99 c89
3个回答
29
投票
  • //
    注释不是 C89 的一部分,但在 C99 中可以,
  • main()
    脱落而不返回任何值相当于 C99 中的
    return 0;
    ,但在 C89 中则不然。 来自N1256(pdf),5.1.2.2.3p1:

    如果

    main
    函数的返回类型是与
    int
    兼容的类型,则从初始调用 main 函数返回相当于使用
    exit
    函数返回的值来调用
    main
    函数:它的论点;到达终止
    }
    函数的
    main
    返回值 0。

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


6
投票

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

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

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


2
投票

在这个论坛上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”关键字的新语义,新 创建匿名聚合、新复数类型的语法, 数百个新的库函数等等。

新的 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是一个实际的“改变”。实际上,TC 并不 确实影响了用户,而 NA1 添加了一系列功能 人们都可以使用,所以NA1确实更有意义。 NA1出来了 1994 年,因此人们可以将“ISO 9899:1990 经 NA1 修改”称为 “C94”。我也见过它叫“C95”。

© www.soinside.com 2019 - 2024. All rights reserved.