C11与C99的变化对比

2021-02-18 10:35:11 浏览数 (1)

C11标准曾用名C1X。 

C11标准是C语言标准的第三个版本,前一个标准版本是C99标准。2011年12月8日,国际标准化组织(ISO)和国际电工委员会 

(IEC)旗下的C语言标准委员会正式发布了C11标准。 

C11标准的最终定稿草案是免费开放的,但是正式标准文件是需要付费的。 

当前,支持此标准的主流C 编译器有:GCC、Clang、Intel C Complier等。 

相比C99的变化: 

 1.对齐处理操作符 alignof,函数aligned_alloc(),以及头文件<stdalign.h> 

 2._Noreturn函数标记,类似于GCC的__((noreturn))。ps:_Noreturn void thrd_exit(int res); 

3._Generic 关键词,有点儿类似于 gcc 的 typeof。 

4.静态断言( static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。例子: 

_Static_assert(FOO > 0, "FOO has a wrong value"); 

5.删除了 gets() 函数,C99中已经将此函数被标记为过时,推荐新的替代函数 gets_s()。 

6.新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。 

7.匿名结构体/联合体,这个早已经在 gcc 中了,我们并不陌生 

8.多线程支持,包括:_Thread_local,头文件 <threads.h>,里面包含线程的创建和管理函数(比如 thrd_create(),thrd_exit()),mutex (比如 mtx_lock(),mtx_unlock())等等 

9._Atomic类型修饰符和 头文件 <stdatomic.h> 

10.带边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等 

11.改进的 Unicode 支持,新的头文件 <uchar.h> 等。 

12.新增 quick_exit() 函数,作为第三种终止程序的方式,当 exit() 失败时可以做最少的清理工作(deinitializition) 

13. 创建复数的宏, CMPLX() 

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()。 

C11还缺少什么? 

1、对IEEE754标准-2008的半精度浮点数的支持。尽管遵循GNU C标准规范的编译器(GCC以及Clang等)使用了C扩展关键字__fp16,但是只能对半精度浮点数进行引用,而不能做任何算术操作。因此,这个特性应当在下一个C语言标准中立马加入进去的,建议使用_Half作为半精度浮点数类型的关键字。 

2、匿名函数:匿名函数,也叫lambda表达式,是现代计算机编程语言的一个典范特性,在Clang编译器中已经通过blocks语法 [4]  进行了支持,该语法也被发表到了下一代C标准的提案 [5-6]  。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字符。

0 人点赞