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_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()失敗時可以做最少的清理工作。

支援

在語言層級,MSVC[7]GCCClang 皆已支援 C11。

雖然語言層級很早就有編譯器支援,但執行緒等函式庫卻很長時間沒有實作,直到2018年 glibc 2.28 才開始支援。

參考

  1. ^ ISO. ISO/IEC 9899:2011. 2011-12-08 [2011-12-08]. (原始內容存檔於2011-12-27) (英語). 
  2. ^ 存档副本 (PDF). [2015-09-02]. (原始內容 (PDF)存檔於2015-09-24). 
  3. ^ GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF). (原始內容存檔於2015-11-04). 
  4. ^ Clang 3.1 Release Notes. (原始內容存檔於2016-03-04). 
  5. ^ 參照錯誤:沒有為名為:0的參考文獻提供內容
  6. ^ WG14 N1570 Committee Draft — April 12, 2011頁面存檔備份,存於網際網路檔案館) Annex K Bounds-checking interfaces
  7. ^ Elnar. C11 and C17 Standard Support Arriving in MSVC. [2021-07-11]. (原始內容存檔於2021-05-11).