C11 (C語言標準)
C程式語言標準,2011年修訂版
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).