C23 (C言語)
テンプレート:Pathnav テンプレート:翻訳直後 テンプレート:要改訳
C23(ISO/IEC 9899:2024)とは、C言語の現在のオープン標準であり、テンプレート:仮リンク(ISO/IEC 9899:2018)の後継規格である[1]。2016年にC2xとして非公式に策定が開始され[2]、2024年10月31日に発行された[3]。発行された規格に最も近い自由に入手できる草案はN3220である(#利用可能な文書を参照)[4]。C2x草案の最初のWG14会議は2019年10月に開催され[5]、新型コロナウイルス感染症の世界的流行によって2020年は仮想リモート会議として開催され、その後、2024年まで様々な遠隔会議が継続的に開催された。
C23では、テンプレート:Codeの値がテンプレート:Codeからテンプレート:Codeに変更される。一般名の「C17」や「C23」はISO規格識別子の年(9899:2018と9899:2024)ではなく、規格発行前に固定されるこれらの値を反映している。
機能
C23の最新の作業草案に統合された変更点は以下の通りである[6]。
標準ライブラリ
新規関数
<テンプレート:仮リンク>にテンプレート:Code関数を追加[7]。機密データを消去する目的で、最適化に関係なく常にメモリ書き込み (store) を実行する必要がある場面で使用される。- テンプレート:Codeに
テンプレート:仮リンク()関数を追加[8]。文字列を効率的に連結する。POSIXとSVIDのC拡張と同様である。 - テンプレート:Codeに
テンプレート:仮リンク()およびテンプレート:Code関数を追加[9]。文字列の複製を割り当てる。POSIXとSVIDのC拡張と同様である。 - ポインタのバイトアライメントを決定するために
<テンプレート:仮リンク>にテンプレート:Code関数を追加[10]。 - 新たなヘッダの
<stdbit.h>を追加し、多くの整数型でビット関連の操作をするための関数、マクロ、データ型を定義。全てstdc_で始まるので古いコードやサードパーティのライブラリとの競合を最小限に抑えることができる[11]。- 以下の
*は特定の整数型向けの関数ではこれをテンプレート:Code、テンプレート:Code、テンプレート:Code、テンプレート:Code、テンプレート:Codeのいずれかに置き換え、ジェネリック関数ではこれを除去して読む[11]。 - ビットで表現した場合の1または0の個数を数えるテンプレート:Codeおよびテンプレート:Code関数を追加[11]。
- ビットで表現した場合の先頭の1または0の個数を数えるテンプレート:Codeおよびテンプレート:Code関数を追加[11]。
- ビットで表現した場合の末尾の1または0の個数を数えるテンプレート:Codeおよびテンプレート:Code関数を追加[11]。
- ビットで表現した場合に最上位ビットから数えて最初に1または0が現れる位置を探すテンプレート:Codeおよびテンプレート:Code関数を追加[11]。
- ビットで表現した場合に最下位ビットから数えて最初に1または0が現れる位置を探すテンプレート:Codeおよびテンプレート:Code関数を追加[11]。
- 値が正しく2の冪乗であるかを確認する(単一のビットだけが1の場合にテンプレート:Codeを返す)テンプレート:Code関数を追加[11]。
- 与えられた値より大きくない最大の2の累乗を計算するテンプレート:Code関数を追加[11]。
- 与えられた値より小さくない最小の2の累乗を計算するテンプレート:Code関数を追加[11]。
- 与えられた値を表すのに必要なビット数を調べるテンプレート:Code関数を追加[11]。
- 以下の
<time.h>にglibcとmuslにあるような時間を表す構造体をテンプレート:Codeに変換できるテンプレート:Code関数を追加する[12]。<テンプレート:仮リンク>にIEEE 754-2019の推奨に基づく単位で動作する三角関数やexp10などの関数を追加[13]。
既存の関数
- テンプレート:Codeとそれに類似する関数に2進数向けの変換指定子のテンプレート:Codeを追加[14]。
- テンプレート:Codeとそれに類似する関数に2進数向けの変換指定子のテンプレート:Codeを追加[14]。
- テンプレート:Codeとテンプレート:Codeとそれらに類似する関数で接頭辞にテンプレート:Codeまたはテンプレート:Codeを持つ文字列に対応[14]。
テンプレート:仮リンク()、テンプレート:仮リンク()、テンプレート:仮リンク()、テンプレート:仮リンク()、テンプレート:仮リンク()、テンプレート:仮リンク()、テンプレート:仮リンク()とそれらのワイド文字対応版のテンプレート:仮リンク()、テンプレート:仮リンク()、テンプレート:仮リンク()、テンプレート:仮リンク()、テンプレート:仮リンク()でconst修飾オブジェクトが渡された場合にそれを返すようにする[15]。
プリプロセッサ
- テンプレート:Codeおよびテンプレート:Codeディレクティブを追加[16]。これらは基本的にテンプレート:Codeとテンプレート:Codeと同じである。これらはどちらもテンプレート:NowrapとGCC 12に追加された[17]。
- バイナリリソースを埋め込むためのテンプレート:Codeディレクティブとプリプロセッサディレクティブによってリソースの存在を確認できるようにするテンプレート:Codeを追加[18]。
- 診断用のテンプレート:Codeディレクティブを追加[19]。
- ヘッダの存在をプリプロセッサディレクティブで確認できるようにするテンプレート:Codeを追加[20]。
- 属性の存在をプリプロセッサディレクティブで確認できるようにするテンプレート:Codeを追加[21](新たな属性機能については#C++との互換性を参照)。
- テンプレート:Codeマクロを追加。これはマクロのパラメータとして受け取った可変長引数が空でない場合に置換するトークンを指定する[22]。
データ型
- ヌルポインタ型の
テンプレート:仮リンクを追加[23]。 - 正確なビット単位の数値を表すテンプレート:Codeおよびテンプレート:Code型を追加。最大ビット幅を表すテンプレート:Codeマクロを追加[24][25]。
- オーバーフローを検査する整数演算用のテンプレート:Code、テンプレート:Code、テンプレート:Codeマクロを追加[26]。
- 可変変更型(スタック上に割り当てられるテンプレート:仮リンクである可変長配列は除く)が必須機能になる[27]。
- 配列での
テンプレート:仮リンクの使用に対する対応の向上[28]。 テンプレート:仮リンク(...)演算子が標準化[29]。- テンプレート:Codeキーワードの意味は、型推論をもたらすように変更されたが、一方で型と同時に指定された場合、従来の古い意味であるテンプレート:仮リンクとなる機能も引き続き保持している。C++とは異なり、C23では変数宣言でのみ型推論が許可されている(関数のパラメータや戻り値の型に対しては認められない)[30]。
- 構造体、共用体、列挙型の互換性ルールが変更され、同じタグを持つ互換性のある型の再宣言が可能となった[31]。
- 固定長整数型の幅がテンプレート:Codeを超える可能性があるようになった(N2888)[32]。
定数
- [[C++11#ヌルポインタ|テンプレート:Code]]定数をテンプレート:Code型に追加[23]。
- テンプレート:Codeおよびテンプレート:Code型にテンプレート:Codeおよびテンプレート:Code整数リテラル接尾辞を追加[33]。例えば、テンプレート:Codeはテンプレート:Codeを表し、テンプレート:Codeは値を表す3つのビットと符号を表す1つのビットを持つテンプレート:Codeを表す。
- テンプレート:仮リンクに2進数を表すテンプレート:Codeおよびテンプレート:Code接頭辞を追加[34]。例えば、テンプレート:Codeは16進数を表す整数リテラルのテンプレート:Codeと等しい。
- 数値リテラルの区切り文字としてテンプレート:Codeを追加[35]。例えば、テンプレート:Codeはテンプレート:Codeと等しく、テンプレート:Codeは[[光速|テンプレート:Code]]と等しく、テンプレート:Codeは[[2の平方根|テンプレート:Code]]と等しい。
- [[列挙型|テンプレート:Code]]の基底型 (underlying type) を指定できる機能を追加[36]。
- 基底型が省略されたテンプレート:Codeに、テンプレート:Codeで表現できない値を格納できるようにする[37]。
キーワード
- テンプレート:Codeおよびテンプレート:Codeキーワードを追加[38]。
- テンプレート:Code、テンプレート:Code、テンプレート:Code、テンプレート:Code、[[スレッド局所記憶|テンプレート:Code]]キーワードを追加。従来のテンプレート:Code、テンプレート:Code、テンプレート:Code、テンプレート:Code、テンプレート:Codeキーワードはこれらの新しいキーワードの別表記になる[39]。
- テンプレート:Codeキーワードを追加(#データ型を参照)。
- テンプレート:Codeおよびテンプレート:Codeキーワードを追加(#データ型を参照)。
- テンプレート:Codeキーワードを追加(#定数を参照)。
- テンプレート:Codeキーワードを追加(#その他の機能を参照)。
- オプショナルなテンプレート:仮リンク演算用のテンプレート:Code、テンプレート:Code、テンプレート:Codeキーワードを追加(#その他の機能を参照)。
構文
- ラベルをテンプレート:仮リンクの前と複合文の末尾に配置できるようになる[40]。
- 関数定義でパラメータ名を省略可能に[41]。
- テンプレート:Codeによるゼロ値初期化(可変長配列の初期化を含む)[42]。
- 可変長引数関数は省略記号(テンプレート:Code)の前に名前付きパラメータを必要としなくなり、テンプレート:Codeマクロは2番目の引数を必要としなくなり、最初の引数の後に引数があっても評価しないようになった[43]。
- C++11形式の二重角括弧(テンプレート:Code)を使用する属性構文を追加[44]。C23ではC++にはない以下の独自の属性が追加される:
- テンプレート:Code属性[45]は引数が同じならば常に同じ結果を返し、他のデータに依存関係を持たない関数型に対して付与する。
- テンプレート:Code属性[45]はテンプレート:Code属性に似ているが関数の呼び出し順序も重要である場合に付与する。
- C++17との互換性のために
テンプレート:仮リンクに単一引数を追加[46]。 - プロトタイプ宣言で引数がない関数(例えばテンプレート:Code)は、引数を取らない関数であるとして扱われる(#廃止された機能を参照)。
C++との互換性
- 宣言の前のラベル、関数定義でのパラメータ名の省略の許容、テンプレート:Codeによるゼロ値初期化、可変長引数関数での名前付きパラメータのオプショナル化、C++11形式の属性、
テンプレート:仮リンク(#構文を参照)などの様々な構文の変更によりC++との互換性が向上した。複合文の末尾でのラベルについてはC23の互換性のためにテンプレート:仮リンクで許可されるように変更された[47]。 - C++形式の属性を追加(#構文を参照)。C++11との互換性のためにテンプレート:Code[48]、テンプレート:Code[49]、テンプレート:Code[50]、テンプレート:Code[51]、テンプレート:Code属性が追加され[52]、C11で導入されたテンプレート:Code、テンプレート:Code、テンプレート:Codeヘッダは非推奨となった[53]。テンプレート:仮リンクとの互換性のために重複する属性は許可されれている[54]。全ての標準属性は二重アンダースコアで囲むことができる(例えば、テンプレート:Codeはテンプレート:Codeと同じ)。
- C++17との互換性のためにUTF-8で符号化されたテンプレート:仮リンクを表すためのテンプレート:Code接頭辞を追加[55][56]。
- テンプレート:仮リンクとの互換性のためにテンプレート:Codeおよびテンプレート:Codeディレクティブを追加[16](#プリプロセッサを参照)。
その他の機能
- 浮動小数点数演算のためにIEEE 754の現行版であるISO/IEC 60559:2020に対応し、拡張された二進浮動小数点数演算とオプショナルの十進浮動小数点数演算に対応する[57][58]。
- C++のそれとは異なり、[[C++11#一般化された定数式|テンプレート:Code]]指定子は定数宣言でのみ使用でき、テンプレート:Code関数は認められていない[59]。
- UTF-8で符号化されたデータを格納するためのテンプレート:Code型が追加され、テンプレート:Code文字(列)リテラルの型がテンプレート:Codeに変更される。また、テンプレート:Code型のマルチバイト文字列とテンプレート:Code型のUTF-8文字列を変換するためのテンプレート:Codeとテンプレート:Codeが追加された[60]。
- 明示的に指定されていない限り、全てのテンプレート:Code文字列(リテラル)がUTF-16で符号化されること、全てのテンプレート:Code文字列(リテラル)がUTF-32で符号化されることが保証されなければならないことが明文化された[61]。
- 複合リテラル定義で記憶域クラス指定子を使用することを許容する[62]。
廃止された機能
いくつかの古く廃止された機能がC23の作業草案では削除または非推奨となった:
- トライグラフは削除された[63]。
- K&R形式の引数の情報のない関数定義は削除された[64][65]。
- 2の補数以外の符号付き整数の表現は削除され、符号付き整数は2の補数形式で表現することが必須となった[66]。
- テンプレート:Codeのテンプレート:Codeマクロは廃止予定の非推奨機能となった[67]。
コンパイラの対応
以下のコンパイラはC23に実験的に対応しており、これを利用するためのオプションを提供している:
利用可能な文書
C17などの他のC言語の標準規格と同様に、C23のISOの公式規格書は自由に入手することはできない。
C23の仕様が確定する前の最後の作業草案は2023年4月1日付のN3096である[6]。この草案の後の数カ月間、2023年7日9日付の作業草案N3149と2024年2月22日付の公式標準草案N3219が作成されるまでに数百の変更[71]が行われた[71][72]。これら以降の草案は非公開である[71][72]。
標準草案N3219が発表されたのと同日、新たな作業草案N3220[4]が公開された。この草案は公式には将来のC言語の標準である「C2Y」の草案であると説明[72]されているが、付随する「編集者レポート」では、N3219との違いは付録Kの1つの脚注の修正だけであると明記されている[72]。
参考文献
- N3096 (last freely-available working draft before C23); WG14; April 2023. (free download)
- N3149 (working draft of C23 standard); WG14; July 2023. (not available to public)
- N3219 (ISO/IEC 9899:2023 DIS Draft); WG14; February 2024. (ISO draft available but not free)
- ISO/IEC 9899:2024 (official C23 standard); ISO; 2024. (planning for release in 2024)
- N3220 (first working draft after C23; differs from draft standard N3219 only in one footnote[72]); WG14; February 2024. (free download)
脚注
関連項目
- テンプレート:仮リンク、C++20、C++17、C++14、C++11、テンプレート:仮リンク、テンプレート:仮リンク - C++の言語規格
- テンプレート:仮リンク
外部リンク
- C Language WG14 (Working Group 14)
- WG14 Document Repository
- WG14 Meetings - agenda and minutes
- WG14 Charters: C2x Charter, C23 Charter, Interpreting the C23 Charter, C Standard Charter
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 4.0 4.1 テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 6.0 6.1 テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 11.00 11.01 11.02 11.03 11.04 11.05 11.06 11.07 11.08 11.09 11.10 テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ See N3096 § B.11 for a useful overview. The functions were added in separate documents: N2488, its updated versions, and its refs.
- ↑ 14.0 14.1 14.2 テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 16.0 16.1 テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 23.0 23.1 テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 45.0 45.1 テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 71.0 71.1 71.2 テンプレート:Cite web
- ↑ 72.0 72.1 72.2 72.3 72.4 テンプレート:Cite web