代码之家  ›  专栏  ›  技术社区  ›  ubiquibacon

ANSI C与其他C标准

  •  28
  • ubiquibacon  · 技术社区  · 14 年前

    在我使用过的几个编译器上 gcc 但各种版本)我得到 C99 mode 声明之类的错误 int i 在for循环表达式中而不是在它之前(如果我不使用 std=c99 选择权。读后 here 我明白 海湾合作委员会 选项 -ansi , -std=c89 -std=iso9899:1990 所有评估均符合ANSI C标准, 但我不明白为什么/如果我应该选择 c89 标准与更新的标准 c99 (我想是最新的)。

    此外,我还看到 iso C语言的类型标准,第一个(据我理解)是ANSI标准的直接端口。 可以这么说吗 ISO 是否会更新C的标准,但C的原始ANSI标准将始终相同?

    红利问题:

    我真的能自己弄明白这个,我只是还没花时间去做,所以如果有人知道他们的想法,那就太好了,否则就没什么大不了的了,我以后再弄清楚:)

    我有这本书的新版本 The C Programming Language (ANSI) . 我的书总是显示这样的循环:

    int i;
    
    for(i = 0; i < foo; i++)
    

    但是许多人(大多数人的小手指上有更多的编程天赋)编写这样的for循环:

    (int i = 0; i < foo; i++)
    

    如果我先写这个循环,对吗 i 应该可以访问整个函数,但是如果我用第二种方法编写它,那么 只能访问for循环 不管 我用什么标准编译?如果我用 C89 标准将 如果我使用 C99 标准将 对于第一个for循环,整个函数都可以访问 第二个for循环中只有for循环可以访问?

    4 回复  |  直到 9 年前
        1
  •  20
  •   Steve Jessop    14 年前

    我不明白为什么/如果我应该 选择C89标准与更新的 标准配置,如C99(最新的 我猜想)。

    有几个原因:

    1)GCC的C99支持不是很完整,而其C89支持是。这就是为什么C89(带有GNU扩展)是默认的。因此,如果您是一个绝对坚持使用gcc编程到标准的人,那么选择c89。

    2)微软的编译器根本不支持C99。因此,如果您想编写可移植的C代码,C89是一个通用标准。

    可以说ISO将更新 他们的C标准,但原始的 美国国家标准协会的C标准将始终是 一样吗?

    不,ISO C99也被批准为ANSI标准。“ansi”这个名字只附在C89上是一个不幸的历史事故。也就是说,C89将永远是C89,这只是不是最新的ANSI C标准。

    如果我写 先绕一圈,然后我应该 可访问整个函数,但 如果我用第二种方式写,那么我就是 只能访问for循环 不管我编译什么标准 用什么?

    你不能用c89的第二种方式写它(即 -pedantic 坚持标准),所以没有“无论什么标准”。带有GNU扩展的C的版本不是标准,它们是“方言”(至少手册页称之为方言)。在C89中,第二个循环是不合法的,在C99中,第二个循环限制了 i 到循环。显然,在这两种情况下,第一个循环 范围更广。

    事实上,即使启用了GNU扩展,GCC也不喜欢C89中的第二个循环。

        2
  •  19
  •   Community Stefan Steinegger    7 年前

    C被ANSI标准化为C89。然后,它被ISO标准化为C90;C89和C90之间没有技术差异。

    C99是C标准的修订版,由ISO C委员会制定,并由ISO和ANSI标准化。C89和C99都是ANSI标准。一般来说,“ansi c”一词通常指c89;《K&R》第二版。这本书只涉及c89,而不是c99。

    为什么选择使用旧版本的C?嗯,至少有两个原因。首先,你可能有一个不支持C99的编译器(例如微软Visual C++只支持C89)。第二,有很多遗留代码使用了C89中不允许使用的代码(您可以在问题中看到更多信息 "C99 backward compatibility" ;这也链接到描述差异的C99基本原理文档)。

    对于“奖金问题”,不能在C89的for语句中声明变量;可以在C99中声明变量。在C89中,for语句的第一部分是表达式。

        3
  •  2
  •   Brock Woolf    14 年前

    我对C标准没有深入的解释。

    但我的默认立场是在有机会的时候使用C99。事实上,它是最新开发的标准是一个原因(我有一种错误的感觉,即“更新就是更好”)。

    主要原因是我可以在for循环中声明变量。

    C99有效:

    for (int i = 0; i < 100; i++)
    {
       doSomething();
    }
    

    C89、ANSI及以上版本:

    int i;
    for (i = 0; i < 100; i++)
    {
       doSomething();
    }
    
        4
  •  0
  •   Jens Gustedt    14 年前

    这个 C99 implementation of gcc 尚未完成,但在日常程序员生活中相当有用。我手头没有参考资料,但是对于GCC来说,有一个声明,他们将在这个实现被认为终止的那天切换到C99(或者仅仅切换到他们的方言GNU99)。

    使用或不使用C99特性的问题分为一个语用部分:

    • 我要去哪个站台 编译我的代码
    • 我将获得什么功能(对于我的口味,许多清洁和易于编程便携式)

    以及情感/意识形态部分。对于后来的人来说,除了恐龙原理的应用之外,没有其他的治疗方法。