我应该使用ANSI C(C89)吗?

mk1*_*k12 16 c c99 c89 ansi-c

这是2012年.我在用C编写一些代码.我还在使用C89吗?还有编译器不支持C99吗?

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

我不确定C89 forbids mixing declarations and code.我倾向于认为在一个地方拥有所有声明实际上更具可读性,如果不是,则该功能太长.

VLA看起来很有用,但我还没有需要它们.

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

Thi*_*ter 13

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

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

C99的一个非常方便的功能是能够做到for(int i = ...)而不必在函数之上声明你的循环变量 - 特别是因为C实际上有一个块范围.这是一种声明,它在顶部确实不会提高可读性.

  • Visual Studio 2013现在支持一些C99功能.见http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview.aspx (2认同)
  • 您可以通过执行`{int i; for(i = ...)...}来解决示例中的问题. (2认同)

Mat*_*arz 9

有一个原因(或许多)为什么C89被C99取代.如果您确定没有C99编译器可用于您的特定工作(不太可能,除非您仍然坚持使用从未正式支持C的Visual Studio),那么您需要继续使用C89,否则您应该确保自己处于您可以从过去20多年的改进中受益的位置.C99没有什么本质上更慢的.

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


ceg*_*ult 6

良好的代码是性能,可伸缩性,可读性和可维护性的混合体.

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

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

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

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

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


小智 6

我不同意 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 合规性方面没有让步。Beijer Electronics 的 SimonRev 在 2016 年 11 月对相关MSDN 主题发表了评论:

概括地说,C99 编译器中唯一实现的部分是那些使 C++ 编译器保持最新状态所需的部分。

自 VC6 以来,微软基本上没有对 C 编译器做任何事情,而且他们也没有透露太多秘密,即他们对本机代码未来的愿景是 C++,而不是 C。

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