C11 (C言語)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
C言語 > C11 (C言語)

C11 は、2011年時点の最新のC言語の規格。C90(C89), C99のように2桁で数字を表す習慣がコンピュータ業界にあり、2000年問題を引き起こしたため、2000年以降のものは、4桁で表現するように改める動きがあり、C2011と表記する場合がある。 ISO/IEC 9899:2011[1] の通称。C99の後継。規格は2011年12月8日に承認。 Technical Corrigendum 1 (ISO/IEC 9899:2011/Cor. 1:2012) を発行している。C90, C99を審議してきたISO/IEC JTC1 SC22 WG14では、訂正後の最新版をWEBで公開してきたが、C2011からはまだ作業前の文書を公開しているだけである。現在のC2011関連の公開文書はWG14 N1570[2]である。

C11 の一部は、GCC 4.6[3]Clang 3.0[4] などで実装開始されている。GCC 4.7 にて、_Atomic, _Generic, glibc にまつわる問題以外は実装が完了している[5]。GCC 4.7 や Clang 3.1 では -std=c11 もしくは -std=gnu11 を指定することで利用可能。

C99からの変更点[編集]

C11 は言語仕様とライブラリの仕様の変更を含む。変更点は以下の通り:[6]

  • アライメント。_Alignas 指定子, alignof 演算子, aligned_alloc 関数, <stdalign.h> ヘッダーファイル)
  • _Noreturn 関数指定子。abort 関数のような戻らない関数を呼び出す関数で使用。
  • _Generic キーワードを使用した型ジェネリック式。例えば、次のマクロ cbrt(x)xの型に基づいて、cbrtl(x), cbrt(x), cbrtf(x) などに置き換わる。
#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)
  • マルチスレッド対応。_Thread_local ストレージクラス指定子, <threads.h> ヘッダーにスレッド作成・管理関数、mutex、条件変数、スレッドローカルデータ。_Atomic 型修飾子、<stdatomic.h> でのアトミックアクセス。
  • C Unicode Technical Report ISO/IEC TR 19769:2004 に基づく、Unicode のサポートの改善。<uchar.h>を追加。char16_tchar32_tを追加。対応する、uU 文字列プレフィックス。UTF-8文字列プレフィックスの u8 追加。[7]
  • メモリ境界チェック付き関数 (Annex K)[8]。C99 で deprecated になった、gets 関数の除去。代わりに、境界チェックを行う、gets_s 関数がある。
  • Analyzability features (Annex L).
  • 浮動小数点型の特徴を調べるためのマクロの追加。
  • 無名構造体と無名 union。構造体や union が入れ子になった場合に便利。例:struct T { int tag; union { float x; int n; }; };
  • 静的アサート。#if#error よりもあとの、コンパイラが型を理解した後でのアサート。
  • fopen() での排他的な作成・オープンモードの ("…x")。POSIXO_CREAT | O_EXCL と同じような処理を行う。
  • exit 関数が失敗した場合の、最低限の終了処理のみを行う quick_exit() 関数。[9]
  • 複素数を作成するマクロ。imaginaryが無限もしくはNaNだとreal + imaginary * Iが期待した値を示さない場合があることが理由の一部[10]

バージョン検出[編集]

マクロ __STDC_VERSION__201112L となっていて、C11 サポートを示している[11]

参照[編集]