C11 (C语言标准)
C语言标准 |
---|
K&R C • ANSI C • C99 • C11 • C18 • C2x |
C11(也被称为C1X)指ISO标准ISO/IEC 9899:2011[1],在它之前的C语言标准为C99。这次修订新增了被主流C语言编译器(如GCC,Clang,Visual C++等)增加的内容,和引入了细部的内存模型以更好的执行多线程。之前C99的一些被推迟的计划在C11中增加了,但是对C99仍保留向后兼容。[2]
GCC从4.6版本开始,已经可以支持一些C11的特性[3],Clang则是从3.1版本开始[4];glibc自2.28版本起支持多线程[5]。
新特性
- 对齐处理(Alignment)的标准化(包括
_Alignas
标志符,alignof
运算符,aligned_alloc
函数以及<stdalign.h>
头文件)。 _Noreturn
函数标记,类似于 gcc 的__attribute__((noreturn))
。_Generic
泛型宏关键字。- 多线程(Multithreading)支持,包括:
_Thread_local
存储类型标识符,<threads.h>
头文件,里面包含了线程的创建和管理函数。_Atomic
类型修饰符和<stdatomic.h>
头文件。
- 增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了
char16_t
和char32_t
数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>
. - 删除了
gets()
函数,使用一个新的更安全的函数gets_s()
替代。 - 增加了边界检查函数接口,定义了新的安全的函数,例如
fopen_s()
,strcat_s()
等等。[6] - 增加了更多浮点处理宏。
- 匿名结构体/联合体支持。这个在gcc早已存在,C11将其引入标准。
- 静态断言(Static assertions),
_Static_assert()
,在解释#if
和#error
之后被处理。 - 新的
fopen()
模式,(“…x”)
。类似 POSIX 中的O_CREAT|O_EXCL
,在文件锁中比较常用。 - 新增
quick_exit()
函数作为第三种终止程序的方式。当exit()
失败时可以做最少的清理工作。
支持
在语言层级,MSVC[7]、GCC 与 Clang 皆已支持 C11。
虽然语言层级很早就有编译器支持,但线程等函数库却很长时间没有实现,直到2018年 glibc 2.28 才开始支持。
参考
- ^ ISO. ISO/IEC 9899:2011. 2011-12-08 [2011-12-08]. (原始内容存档于2011-12-27) (英语).
- ^ 存档副本 (PDF). [2015-09-02]. (原始内容 (PDF)存档于2015-09-24).
- ^ GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF). (原始内容存档于2015-11-04).
- ^ Clang 3.1 Release Notes. (原始内容存档于2016-03-04).
- ^ 引用错误:没有为名为
:0
的参考文献提供内容 - ^ WG14 N1570 Committee Draft — April 12, 2011 (页面存档备份,存于互联网档案馆) Annex K Bounds-checking interfaces
- ^ Elnar. C11 and C17 Standard Support Arriving in MSVC. [2021-07-11]. (原始内容存档于2021-05-11).