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

时间:2012-08-12 21:25:05

标签: c c99 c89 ansi-c

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

我不介意使用/* */代替//

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

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

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

4 个答案:

答案 0 :(得分:13)

除非你知道你不能使用C99兼容的编译器(the Visual Studio C compiler is the most prominent candidate),否则没有充分的理由不使用C99给你的好东西。

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

C99的一个非常方便的功能是能够执行for(int i = ...)而不必在函数之上声明循环变量 - 特别是因为C实际上有一个块范围。这就是那种声明,在它上面真的没有提高可读性。

答案 1 :(得分:9)

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

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

答案 2 :(得分:5)

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

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

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

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

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

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

答案 3 :(得分:2)

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

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

  2. 定位TinyCC编译器,因为在安装巨型工具链的受限环境中可能需要这样做是不切实际的或不允许的。 (TCC已经不再开发,并且Bellard的最后一次statement对于ISOC99的支持是因为它正朝着完全合规的方向发展。)

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

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

  5. 与其公司可能需要使用C89标准的项目的源兼容性。如果您正在编写开源库,并希望在某些行业中最大化其应用程序,那么这一点尤为重要。

  6. 正如cegfault所指出的那样,Wikipedia中列出的某些C99功能非常有用,但如果您的优先级是可移植性或上述任何原因适用,我认为不可缺少。

    似乎微软并未考虑C99合规性。 2016年11月,Beijer Electronics的SimonRev评论了相关的MSDN thread

      

    粗略地说,C99编译器的唯一部分是   实现了他们保持C ++编译器所需的那些部分   最新。

         自从VC6以来,微软基本上没有对C编译器做任何事情   C ++是他们对未来的愿景,他们并没有多少秘密   本机代码,而不是C.

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