C11标准是
ISO/IEC 9899:2011 - Information technology -- Programming languages -- C 的简称,曾用名为C1X。
2. _Noreturn 函数标记,类似于
gcc 的 __attribute__((noreturn))。例子:
3. _
Generic 关键词,有点儿类似于 gcc 的 typeof。示例代码:
4. 静态断言( static
assertions),_Static_assert(),在解释 #if 和
#error 之后被处理。例子:
5. 删除了 gets() 函数,C99中已经将此函数被标记为过时,推荐新的替代函数 gets_s()。
7. 匿名结构体/
联合体,这个早已经在 gcc 中了,我们并不陌生,定义在 6.7.2.1 p13。
10. 带
边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如
fopen_s(),
strcat_s() 等等。更多参考 Annex K。
12. 新增 quick_exit() 函数,作为第三种终止程序的方式,当 exit() 失败时可以做最少的清理工作(deinitializition),具体见 7.22.4.7。
13. 创建复数的宏, CMPLX(),见 7.3.9.3。
14. 更多浮点数处理的宏 (More macros for querying the characteristics of floating point types, concerning
subnormal floating point numbers and the number of decimal digits the type is able to store)。
15. struct timespec 成为
time.h 的一部分,以及宏 TIME_UTC,函数 timespec_get()。
1、对
IEEE754标准-2008的
半精度浮点数的支持。尽管遵循GNU C标准规范的
编译器(
GCC以及
Clang等)使用了C扩展关键字__fp16,但是只能对半精度
浮点数进行引用,而不能做任何
算术操作。因此,这个特性应当在下一个
C语言标准中立马加入进去的,建议使用_Half作为半精度浮点数类型的关键字。
2、
匿名函数:匿名函数,也叫lambda表达式,是现代
计算机编程语言的一个典范特性,在Clang编译器中已经通过blocks语法进行了支持,该语法也被发表到了下一代C标准的提案。
Lambda表达式非常适用于
多核多线程并行计算,而不仅仅只是用于
语法糖。
3、增加对
UTF-16字符编码字符串格式符的支持。在标准
C语言中,直到C11还只能支持
UTF-8编码字符串的格式,采用%s。而对于UTF-16编码字符串的各类操作都比较欠缺,而只有UTF-16转UTF-8的库函数c16rtomb以及UTF-8转UTF-16的标准库函数mbrtoc16可使用,因此在实际项目工程上,用起来十分繁琐。这里建议后续标准C语言采用%S表示UTF-16的字符串格式符,%s作为UTF-8字符串格式符,%C表示UTF-16字符,%c表示UTF-8字符。