C99已经存在了超过10年,但对它的支持一直缓慢,所以大多数开发人员都坚持使用C89 . 即使在今天,当我遇到C代码中的C99功能时,我有时会感到有些惊讶 .
现在大多数主要编译器都支持C99(MSVC是一个值得注意的例外,而且一些嵌入式编译器也落后了),我觉得与C合作的开发人员可能应该知道他们可以使用哪些C99功能 . 一些功能只是之前从未标准化的常见功能(例如, snprintf
),或者熟悉C(灵活变量声明放置或单行 //
注释),但有些新功能最初是在C99中引入的并且对许多程序员来说并不熟悉 .
您在C99中找到了哪些最有用的新功能?
作为参考,the C99 standard(标记为草稿,但据我所知,与更新的标准相同),list of new features和GCC C99 implementation status .
请回答一个问题;随时留下多个答案 . 鼓励展示新功能的简短代码示例 .
17 回答
Unicode转义序列支持:
甚至,字面上的Unicode字符:
(注意:可能不起作用,具体取决于您的语言环境;对不同编码的便携式支持将需要更多工作)
十六进制浮点常量(
0x1.8p0f
)和转换说明符(%a
,%A
) . 如果你经常处理低级数字细节,这些是对十进制文字和转换 .它们可以避免在为算法指定常量时对舍入的担忧,并且对于调试低级浮点代码非常有用 .
就个人而言,我喜欢IEC 60559:1989(微处理器系统的二进制浮点运算)的确认和更好的浮点支持 .
类似地,设置和查询浮点舍入模式,检查Nan / Infinity /次正规数等是很有必要的 .
我很习惯打字
在C中,使用非C99编译器是一种痛苦,我不得不说
stdint.h,它定义了
int8_t
,uint8_t
等 . 不再需要对整数的宽度进行非可移动的假设 .我认为新的初始化机制非常重要 .
好的 - 不是一个引人注目的例子,但符号是准确的 . 您可以初始化数组的特定元素以及结构的特定成员 .
也许更好的例子就是这个 - 虽然我承认它并不是非常引人注目:
支持以
//
开头的单行注释 .可变长度数组:
能够在块的开头以外的位置声明变量 .
变体宏 . 使用无限数量的参数生成样板代码更容易 .
snprintf()
- 说真的,能够做安全的格式化字符串是值得的 .灵活的阵列成员 .
例:
复合文字 . 逐个成员设置结构是'89;)
您还可以使用它们来获取具有自动存储持续时间的对象的指针,而无需声明不必要的变量,例如
的内心
布尔型 .
你现在可以这样做:
将打印
支持
inline
功能 .已经提到的复合文字,但这是我引人注目的例子:
这是一种清晰的方法来初始化数据,即使它在堆上 . 没有办法忘记零初始化的东西 .
restrict
关键字 . 特别是当你处理数字时......