在我使用过的几个编译器上(全部 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功能的问题分为务实的部分:

  • 我必须为哪些平台编译我的代码
  • 我会获得什么功能(为了我的口味清洁和易于编程便携式)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top