33

在我使用过的几个编译器(gcc除了各种版本之外)我得到一个C99 mode错误,比如int i在 for 循环表达式内部而不是在它之前声明(如果我不使用该std=c99选项)。阅读此处后,我了解gccoptions -ansi-std=c89-std=iso9899:1990all 评估为 ANSI C 标准,但我不明白为什么/如果我应该选择c89标准而不是更新的标准c99(我假设这是最新的)。

此外,我看到iso了 C 语言类型标准的多个版本,其中第一个版本(据我所知)是 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 循环访问问同样问题的另一种方法是,如果我使用c89标准编译i,整个函数都可以访问两个 for 循环,如果我使用c99标准编译,整个函数i可以访问第一个 for 循环i的第二个 for 循环只能由 for 循环访问?

4

4 回答 4

22

C 被 ANSI 标准化为 C89。然后它被 ISO 标准化为 C90;C89 和 C90 之间没有技术差异。

C99是C标准的修订版;它由 ISO C 委员会开发,并由 ISO 和 ANSI 标准化。C89 和 C99 都是 ANSI 标准。通俗地说,短语“ANSI C”通常指的是 C89;K&R 第 2 版。书只涵盖 C89,而不是 C99。

为什么选择使用旧版本的 C?好吧,至少有两个原因。首先,您的编译器可能不支持 C99(例如,Microsoft Visual C++ 仅支持 C89)。其次,有很多遗留代码使用了 C89 中不允许在 C99 中使用的东西(您可以在“C99 向后兼容性”问题中看到更多信息;它还链接到描述差异的 C99 基本原理文档)。

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

于 2010-09-24T02:20:29.250 回答
22

我不明白为什么/如果我应该选择 c89 标准而不是像 c99 这样的新标准(我假设这是最新的)。

有几个原因:

1) gcc 的 C99 支持不是很完整,而它的 C89 支持是。这就是为什么 C89(带有 GNU 扩展)是默认设置的原因。因此,如果您是使用 gcc 进行标准编程的绝对坚持者,请选择 C89。

2) 微软的编译器根本不支持 C99。所以如果你想编写可移植的 C 代码,C89 是一个通用标准。

可以肯定地说 iso 会更新他们的 C 标准,但 C 的原始 ANSI 标准总是相同的吗?

不,ISO C99 也被批准为 ANSI 标准。“ansi”这个名字只附在C89上是一个不幸的历史意外。也就是说,C89 将永远是 C89,它只是不是最新的 ANSI C 标准。

如果我以第一种方式编写循环,那么我应该可以访问整个函数,但如果我以第二种方式编写,那么无论我使用什么标准编译,我都只能被 for 循环访问,这是否正确?

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

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

于 2010-09-24T02:37:19.493 回答
3

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

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

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

C99 有效:

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

C89、ANSI 及更早版本:

int i;
for (i = 0; i < 100; i++)
{
   doSomething();
}
于 2010-09-24T03:16:39.930 回答
1

gcc的C99 实现尚未完成,但在日常程序员的生活中相当有用。我手头没有参考资料,但是对于 gcc,在某处声明他们将切换到 C99(或仅切换到他们的方言 gnu99),在此实现被视为终止的那一天。

是否使用 C99 特性的问题,分为务实的部分:

  • 我必须为哪些平台编译我的代码
  • 我将获得什么功能(根据我的口味,很多清洁和易于编程的便携性)

和情感/意识形态部分。对于后者,除了应用恐龙原理之外,没有任何治疗方法。

于 2010-09-24T06:34:59.500 回答