ANSI C与其他C标准

时间:2010-09-24 02:08:44

标签: c gcc ansi-c

在我使用的几个编译器上(所有gcc但各种版本)我得到C99 mode错误,比如在for循环表达式中声明int i而不是在它之前(如果我不要使用std=c99选项)。阅读here后,我了解gcc选项-ansi-std=c89-std=iso9899:1990都符合ANSI C标准,但我不知道理解为什么/我应该选择c89标准而不是像c99那样的新标准(这是我假设的最新标准)。

此外,我看到C语言的iso类型标准的多个版本,其中第一个(根据我的理解)是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,但如果我以第二种方式编写它,那么i只能被for访问循环 REGARDLESS 我编译的标准是什么?另一种提出同样问题的方法,如果我使用c89标准进行编译,那么两个for循环的i都可以被整个函数访问,如果我使用c99标准进行编译,那么第一个for循环的i可以被整个函数访问,而第二个for循环的i只能通过for循环访问吗?

4 个答案:

答案 0 :(得分:20)

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

C99是C标准的修订版;它由ISO C委员会开发,并由ISO和ANSI标准化。 C89和C99都是ANSI标准。一般说来,短语“ANSI C”通常指的是C89; K&amp; R第二版。本书仅涵盖C89,而不是C99。

为什么选择使用旧版本的C?嗯,至少有两个原因。首先,您可能有一个不支持C99的编译器(例如,Microsoft Visual C ++仅支持C89)。其次,有许多遗留代码使用了C99中C99中不允许的内容(您可以在问题"C99 backward compatibility"上看到更多内容;这也链接到描述差异的C99基本原理文档)。 / p>

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

答案 1 :(得分:20)

  

我不明白为什么/如果我应该   选择c89标准而不是更新   标准如c99(这是最新的   我假设。)

有几个原因:

1)gcc的C99支持不是很完整,而它的C89支持是。这就是为什么C89(带有GNU扩展)是默认值。因此,如果你是使用gcc进行标准编程的绝对坚持者,请选择C89。

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

  

可以说iso会更新   他们的标准是C但原件   C的ANSI标准永远是   相同?

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

  

如果我写的是正确的   循环第一种方式,然后我应该   可以访问整个功能,但是   如果我以第二种方式写它,那么我就是   只能访问for循环   无论我编译什么标准   与?

您无法在C89中以第二种方式编写它(即-pedantic遵守标准),因此没有“无论采用何种标准”。具有GNU扩展的C版本不是标准,它们是“方言”(至少这是手册页所称的)。在C89中,第二个循环是不合法的,在C99中,第二个循环将i的范围限制在循环中。显然,在这两种情况下,第一个循环都为i提供了更广泛的范围。

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

答案 2 :(得分:2)

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

但我的默认立场是在有机会时使用C99。它是最新开发的标准这一事实是一个原因(我误导了“越新越好”)。

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

C99有效:

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

C89,ANSI及更早版本:

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

答案 3 :(得分:0)

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

使用C99功能与否的问题,分为实用部分:

  • 我需要的平台 编译我的代码
  • 我会获得哪些功能(因为我的口味很多,清洁度和易于编程的便携性)

和情感/意识形态的一部分。对于后来,除了恐龙原则的应用之外没有治愈方法。