题
在我使用过的几个编译器上(全部 gcc
但是各种版本)我得到一个 C99 mode
诸如声明之类的错误 int i
在for循环表达式内而不是之前(如果我不使用 std=c99
选项)。看完后 这里 我了解 gcc
选项 -ansi
, -std=c89
, , 和 -std=iso9899:1990
所有人都评估为ANSI C标准, 但是我不明白为什么/是否应该选择 c89
标准与较新的标准 c99
(我认为这是最新的)。
另外,我看到了多个版本的 iso
C语言的类型标准,第一个(从我的理解中)是ANSI标准的直接端口。 可以肯定地说 iso
会更新C的C标准,但C的原始ANSI标准始终是相同的?
奖励问题:
我实际上可以自己弄清楚这一点,我只是还没有花时间去做,所以如果有人知道他们的头顶,那就太好了,否则没有任何大事,我稍后会弄清楚:)
我有这本书的新印刷品 The C Programming Language (ANSI)
. 。我的书总是显示这样的循环:
int i;
for(i = 0; i < foo; i++)
但是许多人(大多数在小手指上拥有更多编程才能的人)为这样的循环写下了:
(int i = 0; i < foo; i++)
说如果我以第一个方式编写循环是正确的 i
应该可以访问整个功能,但是如果我以第二种方式编写,则 i
仅适用于for循环 不管 我编译的标准是什么?是否提出同样的问题的另一种方式,我是否与 c89
标准将 i
两者都可以访问整个功能,如果我与 c99
标准将 i
整个功能都可以访问第一个循环 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循环?
您不能以C89中的第二种方式写(即 -pedantic
要遵守标准),因此没有“无论标准如何”。带有GNU扩展名的C版本不是标准,它们是“方言”(至少这就是男人页面所称的)。在C89中,第二个循环不合法,在C99中,第二个循环限制了范围 i
到循环。显然,在这两种情况下,第一个循环给出了 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)。其次,那里有很多旧的代码使用C89中不允许使用C99中的东西(您可以在问题上看到更多信息 “ C99向后兼容”;这也链接到描述差异的C99理由文件)。
至于“奖励问题”,您无法在C89中的构成中声明一个变量;您可以在C99中。在C89中,陈述的第一部分是表达式。
我没有关于C标准的深入解释。
但是我的默认立场是在有机会时使用C99。这是最新发达的标准这一事实是一个原因之一(我有一种误以为“更新的更好”的感觉)。
主要原因是我可以声明循环的变量。
C99有效:
for (int i = 0; i < 100; i++)
{
doSomething();
}
C89,ANSI及以上:
int i;
for (i = 0; i < 100; i++)
{
doSomething();
}
这 C99 GCC的实施 尚未完成,但在日常程序员生活中相当有用。我没有参考,但是对于GCC来说,在某处有一个声明,他们将切换到C99(或仅转换为他们的方言GNU99),因为该实施被认为是终止的。
是否使用C99功能的问题分为务实的部分:
- 我必须为哪些平台编译我的代码
- 我会获得什么功能(为了我的口味清洁和易于编程便携式)
和情感 /意识形态部分。对于后来,除了应用恐龙原则,无法治愈。