トップQs
タイムライン
チャット
視点
C11 (C言語)
ウィキペディアから
Remove ads
C11とは、ISOで定められたC言語の規格のひとつ、ISO/IEC 9899:2011[1]の通称であり、その前の規格であったC99の後継である。規格策定中の暫定名称は C1X であった。新しい規格であるC11では、マルチスレッドのサポートを改善する詳細なメモリモデルなどの、一般的な現代のコンパイラでサポート済みの機能を主に規格化している。C99の実装では適合が遅れたため、C11では中核となる言語規格に準拠し易いよう特定の機能をオプションにしている[2][3]。
2011年4月にC11の最終ドラフトであるN1570[4]が発行され、2011年10月10日に新しいC11規格はその最終ドラフトレビューをパスして公式にISOによって承認された。それから2011年12月8日に参加国による決議が必要な批評もなく、ISO/IEC 9899:2011として発行された。
標準マクロである__STDC_VERSION__
には、C11のサポートが利用可能であることを表すため201112L
という値が定義されている[5]。C11の機能のいくつかは、GCCではバージョン4.6から[6]、Clangではバージョン3.1から[7]、Microsoft Visual C++ではバージョン16.8から[8]、そしてIBM XL Cではバージョン12.1から[9]サポートが開始されている。
Remove ads
C99からの変更点
要約
視点
C11の規格には、C99の言語仕様とライブラリ仕様からの変更が含まれる。変更点は以下の通り[10]:
- アライメントの仕様(
_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
接頭辞)[11]。 gets
関数の削除。gets
関数は以前のC言語の標準リビジョンであるISO/IEC 9899:1999/Cor.3:2007(E) で非推奨となっており、その新しい安全な代替がgets_s
である。- 境界チェックインタフェース (Annex K)[12]。
- 分析機能 (Annex L)。
- 浮動小数点型の特色を調べるためのマクロの追加。非正規な浮動小数点数と小数点以下の桁数においては、その型を保存できる。
- 無名構造体と無名共用体。構造体や共用体が入れ子になった場合に便利。例 :
struct T { int tag; union { float x; int n; }; };
- 静的アサーション。トランスレータが型を理解できる場合、
#if
や#error
よりも後のフェイズの解釈で評価される。 fopen
用の排他的な作成・オープンモード("…x"
接尾辞)。これによりPOSIXのopenにおけるO_CREAT|O_EXCL
のように振る舞う。ロックファイルでよく利用される。- プログラムを終了する3つ目の手段としての
quick_exit
関数。この関数は、exitによる終了が失敗した場合、少なくとも最小限のデイニシャライズを行うことが意図されている[13]。 - 複素数の値を作成するためのマクロ(
real + imaginary*I
では、imaginary
が無限大かNaNの場合は期待された値を出さない可能性があるため)[14]。
Remove ads
オプション機能
新しいリビジョンにおけるC11の実装では規格の一部をサポートしなくともよいが、その一部には1999年のリビジョンでサポートが必須であった規格も含まれる[15]。プログラムからは、C11の実装が特定の機能をサポートしているか否かを判断するための定義済みマクロを利用できる。
Remove ads
批判
オプション機能である境界チェックインタフェース (Annex K) には議論の余地があるため広く実装されておらず、次期規格のリビジョンから非推奨か除去のいずれかにすることが提案されている[19](オープンソースであるOpen Watcom C/C++にはほとんど準拠した実装とみなされる "Safer C" ライブラリが含まれている[20])。
関連項目
注釈・出典
外部リンク
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads