在我使用的几个编译器上(所有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循环访问吗?
答案 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功能与否的问题,分为实用部分:
和情感/意识形态的一部分。对于后来,除了恐龙原则的应用之外没有治愈方法。