C11

2011年發布的C語言標準版

C11標準是 ISO/IEC 9899:2011 - Information technology -- Programming languages -- C 的簡稱,曾用名為C1X。

C11標準是C語言標準的第三版,前一個標準版本是C99標準。2011年12月8日,國際標準化組織(ISO)和國際電工委員會(IEC)旗下的C語言標準委員會(ISO/IEC JTC1/SC22/WG14)正式發布了C11標準。

C11標準的最終定稿的草案是免費開放的,為N1570 ,但是正式標準文件需要198瑞士法郎

當前,支持此標準的主流C++語言編譯器有:GCCClang、Intel C++ Compiler等。

變化


1. 對齊處理操作符 alignof,函數 aligned_alloc(),以及 頭文件 。見 7.15 節。
2. _Noreturn 函數標記,類似於 gcc 的 __attribute__((noreturn))。例子:
_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 中了,我們並不陌生,定義在 6.7.2.1 p13。
8. 多線程支持,包括:_Thread_local,頭文件 ,裡面包含線程的創建和管理函數(比如 thrd_create(),thrd_exit()),mutex (比如 mtx_lock(),mtx_unlock())等等,更多內容清參考 7.26 節。
9. _Atomic類型修飾符和 頭文件 ,見 7.17 節。
10. 帶邊界檢查(Bounds-checking)的函數介面,定義了新的安全的函數,例如 fopen_s(),strcat_s() 等等。更多參考 Annex K。
11. 改進的 Unicode 支持,新的頭文件 等。實例代碼:
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字元。