ANSI C与其他C标准

在我使用的几个编译器(所有gcc但各种版本)上,我得到一个C99 mode错误,比如在for循环表达式中而不是在它之前声明int i (如果我不使用std=c99选项)。 在这里阅读后我明白了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循环访问?

我不明白为什么/如果我应该选择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循环REGARDLESS我编译的标准是什么?

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

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

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的编译器(例如,Microsoft Visual C ++仅支持C89)。 其次,有许多遗留代码使用了C99中C99中不允许的内容(您可以在“C99向后兼容性”问题上看到更多内容;这也链接到描述差异的C99基本原理文档)。

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

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

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

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

C99有效:

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

C89,ANSI及更早:

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

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

使用C99function与否的问题,分为实用部分:

  • 我必须为哪些平台编译我的代码
  • 我将获得什么function(为了我的口味,便携式编程的清洁度和易用性)

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