20

现在是 2012 年。我正在用 C 编写一些代码。我还应该使用 C89 吗?是否还有不支持 C99 的编译器?

我不介意使用/* */而不是//.

我不确定C89 forbids mixing declarations and code。我倾向于认为将所有声明放在一个地方实际上更具可读性,如果不是,则函数太长。

VLA 看起来很有用,但我还不需要它们。

如果没有令人信服的理由,我应该坚持使用 C89 吗?还有其他我没有考虑过的事情吗?

4

4 回答 4

17

除非您知道您不能使用与 C99 兼容的编译器(Visual Studio C 编译器是最突出的候选者),否则没有充分的理由不使用 C99 为您提供的好东西。

但是,即使您需要支持该编译器,您也可以使用一些C99 功能——但不是全部。

C99 的一个非常方便的特性是能够这样做,for(int i = ...)而不必在函数顶部声明循环变量 - 特别是因为 C 实际上具有块作用域。这是一种声明,将它放在最上面确实不会提高可读性。

于 2012-08-12T21:26:25.623 回答
10

C89 被 C99 取代是有原因的(或许多原因)。如果您确定没有 C99 编译器可用于您的特定工作(除非您坚持使用从未正式支持 C 的 Visual Studio),那么您需要继续使用 C89,否则您当然应该将自己置于您可以从过去 20 多年的改进中受益的位置。C99 本身并没有什么慢的。

也许您甚至应该考虑查看最新的 C11 标准。处理 Unicode 有一些重要的修复,任何 C 程序员都可以从中受益(标准中的其他更改绝对是最小的)......

于 2012-08-12T21:32:24.997 回答
7

好的代码是性能、可扩展性、可读性和可维护性的混合体。

在我看来,C99 使代码更易于阅读和维护。非常非常少的编译器不支持 C99,所以我说去吧。使用您可用的工具,除非您确定需要使用需要早期标准的编译器来编译您的项目。

查看这些链接以了解有关 C99 优势的更多信息:

http://www.kuro5hin.org/?op=displaystory;sid=2001/2/23/194544/139

http://en.wikipedia.org/wiki/C99#Design

请注意,C99 还支持库函数,例如snprintf,非常有用,并且具有更好的浮点支持。此外,我发现宏非常有用,尤其是在处理数学密集型应用程序(如加密算法)时

于 2012-08-12T21:34:46.110 回答
4

我不同意 Paul R 的“底线”评论。在多种情况下,C89 有利于便携性。

  1. 针对嵌入式系统,可能有也可能没有支持 C99 的编译器: https ://groups.google.com/forum/#!topic/comp.arch.embedded/WNvhw3T_9pI%5B1-25%5D

  2. TinyCC编译器为目标,这可能需要在安装巨大工具链不切实际或不允许的受限环境中。(TCC 不再被开发,Bellard 关于 ISOC99 支持的最后声明是它正在“走向”完全合规。)

  3. 支持通过 libtcc 进行动态编译(见上文)。

  4. 正如其他人所指出的,针对 MSVC。

  5. 为了与公司可能要求使用 C89 标准的项目实现源代码兼容性。如果您正在编写一个开源库,并且希望在某些行业中最大化其应用,这一点尤其重要。

正如 cegfault 所指出的,维基百科上列出的一些 C99 功能可能非常有用,但如果您的优先级是可移植性,或者上述任何原因适用,我认为这些功能都不是必不可少的。

微软似乎没有在 C99 合规性上做出让步。来自北尔电子的 SimonRev在 2016 年 11 月评论了一个相关的MSDN 线程:

概括地说,C99 编译器中唯一实现的部分是它们需要使 C++ 编译器保持最新的部分。

自 VC6 以来,微软基本上没有对 C 编译器做任何事情,而且他们并没有隐瞒 C++ 是他们对本机代码未来的愿景,而不是 C。

总之,如果您想要嵌入式或受限系统的可移植性、动态编译、MSVC 或与专有源代码的兼容性,我会说 C89 是有利的。

于 2017-03-07T14:32:00.777 回答