C99为该语言添加了几个有用的功能,但我发现很难推荐依赖于C99的任何实践方法。这是因为很少(或者根本没有?)实际实现C99语言。当然,一些编译器有限的支持,但是没有人想花时间编写C代码,并使其不可移植。
鉴于标准已经编写和最终确定了超过10年了,这是令人沮丧的。此外,我时不时听到关于C1x的讨论,我想知道为什么有人会采取修订语言的步骤,而当前版本的语言尚未实现。
那么我的问题是:作为今天的普通C程序员,C99标准对我有哪些实用价值(如果有的话)?
C99为该语言添加了几个有用的功能,但我发现很难推荐依赖于C99的任何实践方法。这是因为很少(或者根本没有?)实际实现C99语言。当然,一些编译器有限的支持,但是没有人想花时间编写C代码,并使其不可移植。
鉴于标准已经编写和最终确定了超过10年了,这是令人沮丧的。此外,我时不时听到关于C1x的讨论,我想知道为什么有人会采取修订语言的步骤,而当前版本的语言尚未实现。
那么我的问题是:作为今天的普通C程序员,C99标准对我有哪些实用价值(如果有的话)?
icc
是否支持 C99? - Billy ONealMSVC不支持C99,而且可能永远都不会支持。但是微软没有太多更新他们的C编译器的动力。他们不会因为这个失去太多业务。
但有很多编译器支持C99。
http://en.wikipedia.org/wiki/C99#Implementations
关于gcc:
http://gcc.gnu.org/c99status.html
你说得对,也许C99对于库代码并不实用(如果没有Microsoft的支持可能永远不会实用),但是如果你在做内部或个人项目时可以自己选择编译器和工具,那么可移植性就不是什么问题了。
strlcpy
和 strlcat
;我不在意。)根据定义,任何扩展都“破坏了可移植性”,但将其纳入标准的目的是为了解决这个问题。此外,如果这意味着微软可能真的想要与 C1x 同步,那将是很棒的。 - jamesdlinx
和y
是“简单变量”,(x>>y) | (x >> (31-y) >> 1)
可能会转换为一系列糟糕的指令,而__rotright(x,y)
更可能产生单个指令。 - supercatwctype.h
和stdint.h
中大部分有用的内容都缺失了。我对其他缺失的内容不是110%熟悉,但这些是重要的功能块,现在却不在那里。 - Billy ONealwctype.h
所“缺失”的只是宽字符格式字符串检查,而这在C99中并没有规定——这只是一个“好用的”功能。stdint.h
仅在“某些平台”上缺失。 - caf如果您关心性能,那么离不开使用restrict
。
FreeBSD现在使用Clang进行内核编译,而且它几乎支持C99。