C11 (C言語)

C11とは、ISOで定められたC言語の規格のひとつ、ISO/IEC 9899:2011ISO/IEC 9899:2011 - Information technology - Programming languages - Cの通称であり、その前の規格であったC99の後継である。規格策定中の暫定名称は C1X であった。新しい規格であるC11では、マルチスレッドのサポートを改善する詳細なメモリモデルなどの、一般的な現代のコンパイラでサポート済みの機能を主に規格化している。C99の実装では適合が遅れたため、C11では中核となる言語規格に準拠し易いよう特定の機能をオプションにしているWG14 N1460 Subsetting the C Standard。

2011年4月にC11の最終ドラフトであるN1570が発行され、2011年10月10日に新しいC11規格はその最終ドラフトレビューをパスして公式にISOによって承認された。それから2011年12月8日に参加国による決議が必要な批評もなく、ISO/IEC 9899:2011として発行された。

標準マクロである__STDC_VERSION__には、C11のサポートが利用可能であることを表すため201112Lという値が定義されている。C11の機能のいくつかは、GCCではバージョン4.6からGCC 4.6 Release Series ? Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)、Clangではバージョン3.1からClang 3.1 Release Notes、Microsoft Visual C++ではバージョン16.8からMicrosoft C++ 言語の準拠表 | Microsoft Docs、そしてではバージョン12.1からSupport for ISO C11 added to IBM XL C/C++ compilersサポートが開始されている。

 C99からの変更点 
C11の規格には、C99の言語仕様とライブラリ仕様からの変更が含まれる。変更点は以下の通り:

 アライメントの仕様（_Alignas指定子、alignof演算子、aligned_alloc関数、<stdalign.h>ヘッダファイル）
 _Noreturn関数指定子と<stdnoreturn.h>ヘッダファイル。
 _Genericキーワードを使用した型ジェネリック式。例えば、次のマクロcbrt(x)はxの型に応じてcbrtl(x)、cbrt(x)、cbrtf(x)などに置き換わる。
#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)
 マルチスレッドのサポート（_Atomic、無停止オブジェクトアクセス用の<stdatomic.h>以外にも、_Thread_localストレージクラス指定子、スレッド作成・管理関数を含む<threads.h>ヘッダ、ミューテックス、条件変数、スレッド局所記憶機能）。
 C Unicode Technical Report ISO/IEC TR 19769:2004に基づくUnicodeのサポートの改善（UTF-16/UTF-32でエンコードされたデータを保存するためのchar16_tとchar32_t型、<uchar.h>の変換関数、uとU文字列リテラル接頭辞、UTF-8でエンコードされたリテラル用のu8接頭辞）。
 gets関数の削除。gets関数は以前のC言語の標準リビジョンであるISO/IEC 9899:1999/Cor.3:2007(E) で非推奨となっており、その新しい安全な代替がgets_sである。
 インタフェース (Annex K)。
 分析機能 (Annex L)。
 浮動小数点型の特色を調べるためのマクロの追加。非正規な浮動小数点数と小数点以下の桁数においては、その型を保存できる。
 無名構造体と無名共用体。構造体や共用体が入れ子になった場合に便利。例 : 
 静的アサーション。トランスレータが型を理解できる場合、#ifや#errorよりも後のフェイズの解釈で評価される。
 fopen用の排他的な作成・オープンモード（"…x"接尾辞）。これによりPOSIXのにおけるO_CREAT|O_EXCLのように振る舞う。ロックファイルでよく利用される。
 プログラムを終了する3つ目の手段としてのquick_exit関数。この関数は、による終了が失敗した場合、少なくとも最小限のデイニシャライズを行うことが意図されているWG14 N1327 Abandoning a Process。
 複素数の値を作成するためのマクロ（real + imaginary*Iでは、imaginaryが無限大かNaNの場合は期待された値を出さない可能性があるため）。

 オプション機能 
新しいリビジョンにおけるC11の実装では規格の一部をサポートしなくともよいが、その一部には1999年のリビジョンでサポートが必須であった規格も含まれる。プログラムからは、C11の実装が特定の機能をサポートしているか否かを判断するための定義済みマクロを利用できる。

+ C11でオプションの機能 機能 機能をテストするマクロ C99での利用可否 分析機能 (Annex L) __STDC_ANALYZABLE__  境界チェックインタフェース (Annex K) __STDC_LIB_EXT1__  マルチスレッド (<threads.h>)  __STDC_NO_THREADS__  原子的なプリミティブと型（<stdatomic.h>と_Atomic型修飾子）WG14 N1558 Mar 14-18 meeting minutes (draft)  __STDC_NO_ATOMICS__  IEC 60559浮動小数点演算 (Annex F) __STDC_IEC_559__  IEC 60559互換の複素数演算 (Annex G) __STDC_IEC_559_COMPLEX__  複素数型 (<complex.h>) __STDC_NO_COMPLEX__  可変長配列ISO 9899:2011 Programming Languages - C 6.7.6.2 4  __STDC_NO_VLA__ 

 批判 
オプション機能である境界チェックインタフェース (Annex K) には議論の余地があるため広く実装されておらず、次期規格のリビジョンから非推奨か除去のいずれかにすることが提案されている（オープンソースであるにはほとんど準拠した実装とみなされる "Safer C" ライブラリが含まれているOpen Watcom Safer C Library）。

 関連項目 
 C99 - 以前のC言語規格
  - 後継のC言語規格 (とも)
 C++20, C++17, C++14, C++11, C++03, C++98 - C++言語規格


 注釈・出典 

 外部リンク 
 C1X宣言
 N1570 - 2011年4月12日のC1X最終ドラフト

 規格のドラフト - PDFに加え、シンプルなASCII形式やリンクされたHTML形式で提供されている。
 境界チェックAPIのSafe C Library

 Safe C API-Concise solution of buffer overflow, The OWASP Foundation, OWASP AppSec, Beijing 2011 

Category:C言語
Category:ISO/IEC標準