本页使用了标题或全文手工转换

C11

维基百科,自由的百科全书
跳转至: 导航搜索

C11(也被称为C1X)指ISO标准ISO/IEC 9899:2011[1],是当前最新的C语言标准。在它之前的C语言标准C99。这次修订新增了被主流C语言编译器(如GCC,Clang,Visual C++等)增加的内容,和引入了内存模型以更好的执行多线程。之前C99的一些被推迟的计划在C11中增加了,但是对C99仍保留向后兼容。[2]

GCC从4.6版本开始,已经可以支持一些C11的特性[3],Clang则是从3.1版本开始[4]。但多執行緒相關的函式庫直到2018年還未出現穩定的實作[5],等於沒有編譯器可以完整的支援C11。

新特性[编辑]

  • 对齐处理(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_tchar32_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()失败时可以做最少的清理工作。

支援[编辑]

在語言層級,gccclang 皆已支援C11。gcc 4.6 版本使用參數-std=c1x ,4.7版本以後使用參數-std=c11[5],clang則是自3.1版開始支援,並在LLVM 3.6板之後預設使用C11的語法。但另一個主流編譯器,微軟的 Visual Studio 則是自 C99 開始就沒有支援新的C語言版本了。

然而,雖然 gcc 與 clang 支援C11的語法,卻沒有實作strcat_s()邊界檢查函數以及執行緒相關<threads.h>函式庫[5][7]gcc 的擁護者宣稱這些函式庫是GNU C函式庫的責任而不是gcc的責任——儘管gcc和GNU C函式庫都是GNU計畫的子計畫。而clang本身並沒有自己重寫函式庫的計畫,他始終是與gcc或其他編譯器共用函式庫。C11的多執行緒等特性實際上沒有任何一個主流編譯器支援。

参考[编辑]

  1. ^ ISO. ISO/IEC 9899:2011. 2011-12-08 [2011-12-08] (英语). 
  2. ^ http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1250.pdf
  3. ^ GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF). 
  4. ^ Clang 3.1 Release Notes. 
  5. ^ 5.0 5.1 5.2 C11Status - GCC Wiki. gcc.gnu.org. [2018-03-17]. 
  6. ^ WG14 N1570 Committee Draft — April 12, 2011 Annex K Bounds-checking interfaces
  7. ^ 14092 – Support C11 threads. sourceware.org. [2018-03-17] (英语).