在我使用的几个编译器(gcc除了各种版本之外的所有版本)中,我得到一个C99 mode错误,例如int i在for循环表达式中而不是在它之前声明(如果我不使用该std=c99选项).在这里阅读之后,我理解gcc选项-ansi,-std=c89并且-std=iso9899:1990都评估为ANSI C标准,但我不明白为什么/如果我应该选择c89标准而不是更新的标准c99(这是我假设的最新标准).
此外,我看到isoC语言的类型标准的多个版本,其中第一个(根据我的理解)是ANSI标准的直接端口. 是否可以肯定地说iso将更新他们的C标准,但C的原始ANSI标准将始终是相同的?
奖金问题:
我实际上可以自己弄清楚这一点,我还没有花时间去做,所以如果有人知道他们的头顶那么这很好,否则没什么大不了的,我以后会搞清楚的:)
我有一本相当新的书The C Programming Language (ANSI).我的书总是显示像这样的循环:
int i;
for(i = 0; i < foo; i++)
Run Code Online (Sandbox Code Playgroud)
但很多人(他们的小指中有大多数编程才能)都会像这样编写for循环:
(int i = 0; i < foo; i++)
Run Code Online (Sandbox Code Playgroud)
如果我以第一种方式编写循环然后i应该可以访问整个函数是正确的,但是如果我以第二种方式编写它,那么i只能访问for循环REGARDLESS我编译的标准是什么?另一种问同样问题的方法,如果我使用c89标准进行编译,那么ifor循环的两个for循环都可以被整个函数访问,如果我使用c99标准进行编译,i那么整个函数可以访问第一个for循环i.第二个for循环只能通过for循环访问?
Ste*_*sop 21
我不明白为什么/如果我应该选择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了循环的范围.显然,在这两种情况下,第一个循环都提供i了更广泛的范围.
事实上,即使启用了GNU扩展,gcc也不喜欢C89中的第二个循环.
Jam*_*lis 20
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语句的第一部分是表达式.