C11 (C言語)

C言語 > C11 (C言語)

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]サポートが開始されている。

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_tchar32_t型、<uchar.h>の変換関数、uU文字列リテラル接頭辞、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"接尾辞)。これによりPOSIXopen(英語版)におけるO_CREAT|O_EXCLのように振る舞う。ロックファイルでよく利用される。
  • プログラムを終了する3つ目の手段としてのquick_exit関数。この関数は、exit(英語版)による終了が失敗した場合、少なくとも最小限のデイニシャライズを行うことが意図されている[13]
  • 複素数の値を作成するためのマクロ(real + imaginary*Iでは、imaginaryが無限大かNaNの場合は期待された値を出さない可能性があるため)[14]

オプション機能

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

C11でオプションの機能
機能 機能をテストするマクロ C99での利用可否[16]
分析機能 (Annex L) __STDC_ANALYZABLE__ 不可
境界チェックインタフェース (Annex K) __STDC_LIB_EXT1__ 不可
マルチスレッド (<threads.h>) __STDC_NO_THREADS__ 不可
原子的なプリミティブと型(<stdatomic.h>_Atomic型修飾子)[17] __STDC_NO_ATOMICS__ 不可
IEC 60559浮動小数点演算 (Annex F) __STDC_IEC_559__ オプション
IEC 60559互換の複素数演算 (Annex G) __STDC_IEC_559_COMPLEX__ オプション
複素数型 (<complex.h>) __STDC_NO_COMPLEX__ ホストされた実装では必須
可変長配列[18] __STDC_NO_VLA__ 必須

批判

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

関連項目

  • C99 - 以前のC言語規格
  • C17(英語版) - 後継のC言語規格 (C18(英語版)とも)
  • C++20, C++17, C++14, C++11, C++03, C++98 - C++言語規格
  • CとC++の互換性(英語版)

注釈・出典

  1. ^ ISO/IEC 9899:2011 - Information technology - Programming languages - C
  2. ^ WG14 N1250 The C1X Charter
  3. ^ WG14 N1460 Subsetting the C Standard
  4. ^ WG14 N1570 Committee Draft ? April 12, 2011
  5. ^ “Defect report #411”. ISO/IEC JTC1/SC22/WG14 - C (February 2012). 2012年5月4日閲覧。
  6. ^ GCC 4.6 Release Series ? Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)
  7. ^ Clang 3.1 Release Notes
  8. ^ Microsoft C++ 言語の準拠表 | Microsoft Docs
  9. ^ Support for ISO C11 added to IBM XL C/C++ compilers
  10. ^ WG14 N1516 Committee Draft ? October 4, 2010
  11. ^ WG14 N1286 ? "On Support for TR-19769 and New Character Types", Nick Stoughton, Larry Dwyer
  12. ^ Berin Babcock-McConnell. “API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size”. 2017年12月5日閲覧。
  13. ^ WG14 N1327 Abandoning a Process
  14. ^ WG14 N1464 Creation of complex value
  15. ^ WG14 N1548 Committee Draft ? December 2, 2010 6.10.8.3 Conditional feature macros
  16. ^ ISO 9899:1999 6.10.8 Predefined macro names
  17. ^ WG14 N1558 Mar 14-18 meeting minutes (draft)
  18. ^ ISO 9899:2011 Programming Languages - C 6.7.6.2 4
  19. ^ WG14 N1969 ? "Updated Field Experience With Annex K ? Bounds Checking Interfaces", Carlos O'Donell, Martin Sebor
  20. ^ Open Watcom Safer C Library

外部リンク

  • C1X宣言
  • N1570 - 2011年4月12日のC1X最終ドラフト
  • ISO C Working Groupの公式ウェブサイト
  • 規格のドラフト - PDFに加え、シンプルなASCII形式やリンクされたHTML形式で提供されている。
  • 境界チェックAPIのSafe C Library
  • Plum, Thomas (April 6, 2012). “C Finally Gets A New Standard”. Dr. Dobb's Journal. http://drdobbs.com/cpp/232800444. 
  • Safe C API-Concise solution of buffer overflow, The OWASP Foundation, OWASP AppSec, Beijing 2011
  • K&R
  • ANSI C
    • C89
    • C90
  • C99
  • C11
  • C17(英語版)
  • C2x(英語版)
  • Embedded C(英語版)
  • MISRA C
Cの機能
  • 関数
  • ヘッダファイル
  • 演算子
  • 文字列(英語版)
  • 文法(英語版)
  • プリプロセッサ(英語版)
  • データ型(英語版)
  • キーワード
  • フリースタンディング環境
  • 標準Cライブラリの関数
    • ctype.h(英語版)
    • stdio.h
    • math.h(英語版)
    • stdlib.h(英語版)
    • string.h(英語版)
    • time.h
    • stdarg.h(英語版)
    • POSIXライブラリ(英語版)
    標準Cライブラリ
    コンパイラ
    統合開発環境
    派生言語
    関連項目
    • カテゴリ カテゴリ