この項目「C23 (C言語)」は翻訳されたばかりのものです。不自然あるいは曖昧な表現などが含まれる可能性があり、このままでは読みづらいかもしれません。(原文:英語版 "C23 (C standard revision)" 2024年11月2日 (土) 08:03 (UTC)) 修正、加筆に協力し、現在の表現をより自然な表現にして下さる方を求めています。ノートページや履歴も参照してください。(2024年11月) |
原文と比べた結果、この記事には多数の(または内容の大部分に影響ある)誤訳があることが判明しています。情報の利用には注意してください。 (2024年11月) |
C23(ISO/IEC 9899:2024)とは、C言語の現在のオープン標準であり、C17(ISO/IEC 9899:2018)の後継規格である。2016年にC2xとして非公式に策定が開始され、2024年10月31日に発行された。発行された規格に最も近い自由に入手できる草案はN3220である(#利用可能な文書を参照)。C2x草案の最初のWG14会議は2019年10月に開催され、新型コロナウイルス感染症の世界的流行によって2020年は仮想リモート会議として開催され、その後、2024年まで様々な遠隔会議が継続的に開催された。
C23では、__STDC_VERSION__の値が201710Lから202311Lに変更される。一般名の「C17」や「C23」はISO規格識別子の年(9899:2018と9899:2024)ではなく、規格発行前に固定されるこれらの値を反映している。
C23の最新の作業草案に統合された変更点は以下の通りである。
<string.h>にmemset_explicit()関数を追加。機密データを消去する目的で、最適化に関係なく常にメモリ書き込み (store) を実行する必要がある場面で使用される。<string.h>にmemccpy()関数を追加。文字列を効率的に連結する。POSIXとSVIDのC拡張と同様である。<string.h>にstrdup()およびstrndup()関数を追加。文字列の複製を動的に確保する。POSIXとSVIDのC拡張と同様である。<stdlib.h>にmemalignment()関数を追加。<stdbit.h>を追加し、多くの整数型でビット関連の操作をするための関数、マクロ、データ型を定義。全てstdc_で始まるので古いコードやサードパーティのライブラリとの競合を最小限に抑えることができる。
*は特定の整数型向けの関数ではこれをuc、us、ui、ul、ullのいずれかに置き換え、型ジェネリックマクロではこれを除去して読む。stdc_count_ones*()およびstdc_count_zeros*()関数を追加。stdc_leading_ones*()およびstdc_leading_zeros*()関数を追加。stdc_trailing_ones*()およびstdc_trailing_zeros*()関数を追加。stdc_first_leading_one*()およびstdc_first_leading_zero*()関数を追加。stdc_first_trailing_one*()およびstdc_first_trailing_zero*()関数を追加。trueを返す)stdc_has_single_bit*()関数を追加。stdc_bit_floor*()関数を追加。stdc_bit_ceil*()関数を追加。stdc_bit_width*()関数を追加。<time.h>にglibcとmuslにあるような時間を表す構造体をtime_tに変換できるtimegm()関数を追加する。<math.h>にIEEE 754-2019の推奨に基づく単位で動作する三角関数やexp10などの関数を追加。#elifdefおよび#elifndefディレクティブを追加。これらは基本的に#elif definedと#elif !definedと同じである。これらはどちらもC++23とGCC 12に追加された。#embedディレクティブとプリプロセッサディレクティブによってリソースの存在を確認できるようにする__has_embedを追加。#warningディレクティブを追加。__has_includeを追加。__has_c_attributeを追加(新たな属性機能については#C++との互換性を参照)。__VA_OPT__マクロを追加。これはマクロのパラメータとして受け取った可変長引数が空でない場合に置換するトークンを指定する。nullptr_tを追加。_BitInt(N)およびunsigned _BitInt(N)型を追加。最大ビット幅を表すBITINT_MAXWIDTHマクロを追加。ckd_add()、ckd_sub()、ckd_mul()マクロを追加。constの使用に対する対応の向上。typeof(...)演算子が標準化。autoキーワードの意味は、型推論をもたらすように変更されたが、一方で型と同時に指定された場合、従来の古い意味である記憶域クラス指定子となる機能も引き続き保持している。C++とは異なり、C23では変数宣言でのみ型推論が許可されている(関数のパラメータや戻り値の型に対しては認められない)。intmax_tを超える可能性があるようになった(N2888)。nullptr定数をnullptr_t型に追加。_BitInt(N)およびunsigned _BitInt(N)型にwbおよびuwb整数リテラル接尾辞を追加。例えば、6uwbはunsigned _BitInt(3)を表し、-6wbは値を表す3つのビットと符号を表す1つのビットを持つsigned _BitInt(4)を表す。0bおよび0B接頭辞を追加。例えば、0b10101010は16進数を表す整数リテラルの0xAAと等しい。'を追加。例えば、0xFE'DC'BA'98は0xFEDCBA98と等しく、299'792'458は299792458と等しく、1.414'213'562は1.414213562と等しい。enumの基底型 (underlying type) を指定できる機能を追加。enumに、intで表現できない値を格納できるようにする。trueおよびfalseキーワードを追加。alignas、alignof、bool、static_assert、thread_localキーワードを追加。従来の_Alignas、_Alignof、_Bool、_Static_assert、_Thread_localキーワードはこれらの新しいキーワードの別表記になる。_BitIntキーワードを追加(#データ型を参照)。typeofおよびtypeof_unqualキーワードを追加(#データ型を参照)。nullptrキーワードを追加(#定数を参照)。constexprキーワードを追加(#その他の機能を参照)。_Decimal32、_Decimal64、_Decimal128キーワードを追加(#その他の機能を参照)。{}によるゼロ値初期化(可変長配列の初期化を含む)。...)の前に名前付きパラメータを必要としなくなり、va_startマクロは2番目の引数を必要としなくなり、最初の引数の後に引数があっても評価しないようになった。[[]])を使用する属性構文を追加。C23ではC++にはない以下の独自の属性が追加される:
[[unsequenced]]属性は引数が同じならば常に同じ結果を返し、他のデータに依存関係を持たない関数型に対して付与する。[[reproducible]]属性は[[unsequenced]]属性に似ているが関数の呼び出し順序も重要である場合に付与する。_Static_assertに単一引数を追加。void foo())は、引数を取らない関数であるとして扱われる(#廃止された機能を参照)。{}によるゼロ値初期化、可変長引数関数での名前付きパラメータのオプショナル化、C++11形式の属性、_Static_assert(#構文を参照)などの様々な構文の変更によりC++との互換性が向上した。複合文の末尾でのラベルについてはC23の互換性のためにC++23で許可されるように変更された。[[deprecated]]、[[fallthrough]]、[[maybe_unused]]、[[nodiscard]]、[[noreturn]]属性が追加され、C11で導入された_Noreturn、noreturn、<stdnoreturn.h>ヘッダは非推奨となった。C++23との互換性のために重複する属性は許可されれている。全ての標準属性は二重アンダースコアで囲むことができる(例えば、[[__deprecated__]]は[[deprecated]]と同じ)。u8接頭辞を追加。#elifdefおよび#elifndefディレクティブを追加(#プリプロセッサを参照)。constexpr指定子は定数宣言でのみ使用でき、constexpr関数は認められていない。char8_t型が追加され、u8文字(列)リテラルの型がchar8_tに変更される。また、char型のマルチバイト文字列とchar8_t型のUTF-8文字列を変換するためのmbrtoc8()とc8rtomb()が追加された。char16_t文字列(リテラル)がUTF-16で符号化されること、全てのchar32_t文字列(リテラル)がUTF-32で符号化されることが保証されなければならないことが明文化された。いくつかの古く廃止された機能がC23の作業草案では削除または非推奨となった:
この節は更新が必要とされています。 (2024年11月) |
以下のコンパイラはC23に実験的に対応しており、これを利用するためのオプションを提供している:
また、GCCに関しては、バージョン15からC23がコンパイラ標準となっている。
C17などの他のC言語の標準規格と同様に、C23のISOの公式規格書は自由に入手することはできない。
C23の仕様が確定する前の最後の作業草案は2023年4月1日付のN3096である。この草案の後の数カ月間、2023年7日9日付の作業草案N3149と2024年2月22日付の公式標準草案N3219が作成されるまでに数百の変更が行われた。これら以降の草案は非公開である。
標準草案N3219が発表されたのと同日、新たな作業草案N3220が公開された。この草案は公式には将来のC言語の標準である「C2Y」の草案であると説明されているが、付随する「編集者レポート」では、N3219との違いは付録Kの1つの脚注の修正だけであると明記されている。