C11(以前はC1X、正式にはISO/IEC 9899:2011)[1]は、 Cプログラミング言語の過去の標準です。C99(標準ISO/IEC 9899:1999)に代わるもので、 C17 (標準ISO/IEC 9899:2018)に取って代わられました。C11は主に、一般的な現代のコンパイラですでにサポートされている機能を標準化し、複数の実行スレッドをより適切にサポートするための詳細なメモリモデルが含まれています。準拠したC99実装の提供が遅れたため、C11では特定の機能をオプションにして、コア言語標準への準拠を容易にしています。[2] [3]
最終草案N1570 [4]は2011年4月に発行されました。この新しい規格は2011年10月10日に最終草案レビューを通過し、ISOによって正式に批准され、2011年12月8日にISO/IEC 9899:2011として発行されましたが、参加国の団体による解決を必要とするコメントはありませんでした。
標準マクロはC11サポートが利用可能であることを示す__STDC_VERSION__値で定義されています。 [5]201112L
C99からの変更点
この標準には、 C99言語とライブラリの仕様に対するいくつかの変更が含まれています。 [6]
- アライメント指定(
_Alignas指定子、_Alignof演算子、aligned_alloc関数、<stdalign.h>ヘッダー) - 関数
_Noreturn指定子と<stdnoreturn.h>ヘッダー - キーワードを使用した型汎用式
_Generic。たとえば、次のマクロは、の型に応じて、またはcbrt(x)に変換されます。cbrtl(x)cbrt(x)cbrtf(x)x
#define cbrt(x) _Generic((x), long double: cbrtl, \
デフォルト: cbrt, \
float: cbrtf)(x)
- マルチスレッドサポート(
_Thread_localストレージクラス指定子、<threads.h>スレッド作成/管理関数を含むヘッダー、ミューテックス、条件変数、スレッド固有のストレージ機能、およびC11メモリモデルをサポートするアトミック操作用の<stdatomic.h>[7] )。 - C Unicode技術レポートISO/IEC TR 19769:2004(
char16_tおよびUTF-16 / UTF-32でエンコードされたデータchar32_tを格納するための型(および対応する文字列リテラルプレフィックス、およびUTF-8でエンコードされたリテラルのプレフィックスの変換関数を含む)に基づいてUnicodeサポートが改良されました。[8]<uchar.h>uUu8 - 以前の C 言語標準リビジョン ISO/IEC 9899:1999/Cor.3:2007(E) で非推奨となった関数が削除されました
gets(より安全な に置き換えられましたfgets)。 - 境界チェックインターフェース(付録K)[9]
- 分析可能性の特徴(付録L)。
- 非正規浮動小数点数やその型が格納できる小数点桁数に関する、浮動小数点型の特性を照会するためのマクロが追加されました。
- 匿名構造体および共用体。共用体および構造体がネストされている場合に便利です (例: ) 。
struct T { int tag; union { float x; int n; }; }; - 静的アサーション は、翻訳者が型を理解したときに、
#ifおよびよりも後の段階で翻訳中に評価されます。#error - の排他的な作成およびオープン モード (
"…x"サフィックス)fopen。これは、ロック ファイルでよく使用されるPOSIXO_CREAT|O_EXCLのように動作します。 - プログラムを終了するための第3の方法としての関数
quick_exitであり、最低限の初期化解除を行うことを目的としています。[10] - ある程度のPOSIX互換性を備えた新しい
timespec_get関数と対応する構造。<time.h> - 複素数値を構築するためのマクロ(無限大またはNaN
real + imaginary*Iの場合に期待される値が生成されない可能性があるため)。[11]imaginary
オプション機能
新しい改訂版では、実装が標準の特定の部分をサポートしないことが許可されています。これには、1999年の改訂版でサポートが必須だった部分も含まれます。[12]プログラムは、定義済みのマクロを使用して、実装が特定の機能をサポートしているかどうかを判断できます。
コンパイラサポート
C11の一部の機能は、GCCバージョン4.6以降、[16] Clangバージョン3.1以降、[17] IBM XL Cバージョン12.1以降、[18] Microsoft Visual C++バージョン2019 (16.8) [19]以降で2020年9月からサポートされています。
批判
オプションの境界チェックインターフェース(付録K)は依然として議論の的となっており、広く実装されておらず、次の標準改訂版から廃止または削除することが提案されている。[20]このインターフェースの主な提唱者であるMicrosoftでさえ、定義に準拠していない。[21] さらに、付録Kには、vasprintfやなどのより有用なTR24731-2(動的割り当て関数)は含まれていないopen_memstream。[22]オープンソースの実装には、Open Watcom C/C++の「Safer C」ライブラリ[23]やsafeclibなどがある。[24]
参照
参考文献
- ^ 「ISO/IEC 9899:2011 - 情報技術 - プログラミング言語 - C」。www.iso.org。
- ^ 「WG14 N1250 C1X憲章」(PDF)。
- ^ 「C 標準のサブセット化」www.open-std.org。
- ^ WG14 N1570 委員会草案 — 2011 年 4 月 12 日
- ^ 「欠陥レポート #411」。ISO/IEC JTC1/SC22/WG14 - C。2012年2月。 2012年5月4日閲覧。
- ^ WG14 N1516 委員会草案 — 2010 年 10 月 4 日
- ^ 「アトミック操作ライブラリ - cppreference.com」。en.cppreference.com。
- ^ 「WG14 N1286 — 「TR-19769 と新しい文字タイプのサポートについて」、Nick Stoughton、Larry Dwyer (PDF)。
- ^ Berin Babcock-McConnell. 「API02-C. 配列の読み取りまたは書き込みを行う関数は、ソースまたはターゲットのサイズを指定するための引数を取る必要があります」。
- ^ 「プロセスの放棄」www.open-std.org。
- ^ 「複素数値の作成」www.open-std.org。
- ^ WG14 N1548 委員会草案 — 2010年12月2日 6.10.8.3条件付き機能マクロ
- ^ ISO 9899:1999 6.10.8定義済みマクロ名
- ^ 「WG14 N1558 3月14日〜18日の会議議事録(草案)」(PDF)。
- ^ ISO 9899:2011 プログラミング言語 - C 6.7.6.2 4
- ^ 「GCC 4.6 リリース シリーズ - 変更点、新機能、修正 - GNU プロジェクト - フリーソフトウェア財団 (FSF)」。gcc.gnu.org。
- ^ 「Clang 3.1 リリースノート」。llvm.org。
- ^ 「IBM XL C/C++ コンパイラーに ISO C11 のサポートが追加されました」。www.ibm.com。2014年 4 月 17 日。
- ^ 「C11 および C17 標準サポートが MSVC に登場」。devblogs.microsoft.com。2020年9 月 14 日。
- ^ 「N1969 — 付録 K — 境界チェックインターフェースに関する最新の現場経験」www.open-std.org。
- ^ Leffler、Jonathan。「c - TR 24731 の「安全な」関数を使用していますか?」。Stack Overflow。
- ^ 「c - TR 24731 の「安全な」関数を使用していますか?」。Stack Overflow。
- ^ 「Safer C Library - Open Watcom」。2015年5月3日。2015年5月3日時点のオリジナルよりアーカイブ。
- ^ 「safec: Safe C ライブラリ - README」. rurban.github.io .
さらに読む
- N1570 (C11 標準の作業草案); WG14; 2011. (HTML および ASCII バージョン)
- ISO/IEC 9899:2011 (公式 C11 標準)、ISO、2011。
- Plum, Thomas (2012 年 4 月 6 日)。「C がついに新しい標準を取得」。Dr . Dobb's Journal。
- Safe C API - バッファ オーバーフローの簡潔なソリューション、OWASP Foundation、OWASP AppSec、北京 2011
外部リンク
- C言語ワーキンググループ14(WG14)ドキュメント
- C1X 憲章 - WG14
- 制限された API の安全な C ライブラリ
