C23(ISO/IEC 9899:2024)とは
C23は、
C言語の最新の
オープン標準規格であり、C17(ISO/IEC 9899:2018)の後継として位置づけられます。規格策定は2016年にC2xとして非公式に開始され、2024年10月31日に正式に発行されました。一般に「C17」や「C23」という名称は、ISO規格識別子の年ではなく、規格発行前に固定される`__STDC_VERSION__`の値(それぞれ201710L、202311L)を反映しています。
C23策定の過程では、2019年10月に最初のWG14会議が開催され、その後、新型コロナウイルス感染症の世界的流行の影響を受けつつも、2024年まで遠隔会議が継続的に開催されました。規格の最終版に近い草案はN3220として公開されており、無料で入手可能です。
C23の主な機能
C23では、以下のような変更点や新機能が導入されました。
標準ライブラリ
新規関数
`
`に`memset_explicit()`関数が追加されました。この関数は、機密データの消去を目的としており、最適化による影響を受けずにメモリへの書き込みを保証します。
``に`memccpy()`関数が追加され、効率的な文字列連結が可能になりました。
``に`strdup()`および`strndup()`関数が追加されました。これらの関数は、文字列の複製を動的に割り当てます。
``に`memalignment()`関数が追加され、ポインタのバイトアライメントを決定できるようになりました。
``ヘッダが新設され、整数型のビット操作をサポートする関数群が追加されました。これらの関数は`stdc_`で始まるため、既存のコードとの競合を最小限に抑えることができます。
`stdc_count_ones()`および`stdc_count_zeros()`関数:ビット表現における1または0の個数を数えます。
`stdc_leading_ones()`および`stdc_leading_zeros()`関数:ビット表現における先頭の1または0の個数を数えます。
`stdc_trailing_ones()`および`stdc_trailing_zeros()`関数:ビット表現における末尾の1または0の個数を数えます。
`stdc_first_leading_one()`および`stdc_first_leading_zero()`関数:ビット表現における最上位ビットから数えて最初に1または0が現れる位置を探します。
`stdc_first_trailing_one()`および`stdc_first_trailing_zero()`関数:ビット表現における最下位ビットから数えて最初に1または0が現れる位置を探します。
`stdc_has_single_bit()`関数:値が2の冪乗であるかを確認します。
`stdc_bit_floor()`関数:与えられた値以下の最大の2の累乗を計算します。
`stdc_bit_ceil()`関数:与えられた値以上の最小の2の累乗を計算します。
`stdc_bit_width()`関数:与えられた値を表すのに必要なビット数を調べます。
``に`timegm()`関数が追加され、時間を表す構造体を`time_t`型に変換できるようになりました。
``に、IEEE 754-2019の推奨に基づいた三角関数(πx単位)や`exp10`などの関数が追加されました。
既存関数の変更
`printf()`および類似の関数に、2進数向けの変換指定子 `%b` が追加されました。
`scanf()`および類似の関数にも、2進数向けの変換指定子 `%b` が追加されました。
`strtol()`や`wcstol()`などの関数が、接頭辞`0b`または`0B`を持つ文字列に対応しました。
`bsearch()`、`memchr()`、`strchr()`、`strpbrk()`、`strrchr()`、`strstr()`などの関数で、`const`修飾されたオブジェクトが渡された場合に、`const`修飾された値を返すようになりました。
プリプロセッサ
`#elifdef`および`#elifndef`ディレクティブが追加されました。
バイナリリソースを埋め込むための`#embed`ディレクティブと、リソースの存在を確認するための`__has_embed`が追加されました。
診断用の`#warning`ディレクティブが追加されました。
ヘッダの存在を確認するための`__has_include`が追加されました。
属性の存在を確認するための`__has_c_attribute`が追加されました。
可変長引数が空でない場合にトークンを置換する`__VA_OPT__`マクロが追加されました。
データ型
ヌルポインタ型の`nullptr_t`が追加されました。
正確なビット単位の数値を表す`_BitInt(N)`および`unsigned _BitInt(N)`型が追加され、最大ビット幅を表す`BITINT_MAXWIDTH`マクロが追加されました。
オーバーフローを検査する整数演算用の`ckd_add()`、`ckd_sub()`、`ckd_mul()`マクロが追加されました。
可変変更型(可変長配列を除く)が必須機能となりました。
配列での`const`の使用に対する対応が向上しました。
`typeof(...)`演算子が標準化されました。
`auto`キーワードの意味が型推論を行うように変更されました。
構造体、共用体、列挙型の互換性ルールが変更されました。
固定長整数型の幅が`intmax_t`を超える可能性が許容されるようになりました。
定数
`nullptr`定数が`nullptr_t`型に追加されました。
`_BitInt(N)`および`unsigned _BitInt(N)`型に`wb`および`uwb`整数リテラル接尾辞が追加されました。
整数リテラルに2進数を表す`0b`および`0B`接頭辞が追加されました。
数値リテラルの区切り文字として `'` が追加されました。
`enum`の基底型を指定できる機能が追加されました。
基底型が省略された`enum`に、`int`で表現できない値を格納できるようになりました。
キーワード
`true`および`false`キーワードが追加されました。
`alignas`、`alignof`、`bool`、`static_assert`、`thread_local`キーワードが追加されました。
`_BitInt`キーワードが追加されました。
`typeof`および`typeof_unqual`キーワードが追加されました。
`nullptr`キーワードが追加されました。
`constexpr`キーワードが追加されました。
オプショナルな十進浮動小数点数演算用の`_Decimal32`、`_Decimal64`、`_Decimal128`キーワードが追加されました。
構文
ラベルを宣言の前と複合文の末尾に配置できるようになりました。
関数定義でパラメータ名を省略できるようになりました。
`{}`によるゼロ値初期化が可能になりました。
可変長引数関数は、省略記号(`...`)の前に名前付きパラメータを必要としなくなり、`va_start`マクロは2番目の引数を必要としなくなりました。
C++11形式の二重角括弧(`[[]]`)を使用する属性構文が追加されました。
C23では、C++との互換性を高めるために、様々な変更が行われました。
宣言前のラベル、関数定義でのパラメータ名省略、`{}`によるゼロ値初期化、C++11形式の属性構文など、C++との共通の構文が導入されました。
`deprecated`、`fallthrough`、`maybe_unused`、`nodiscard`、`noreturn`属性が追加され、C++11で導入された`_Noreturn`、`noreturn`、``ヘッダは非推奨となりました。
C++17との互換性のために、UTF-8で符号化された文字リテラルを表すための`u8`接頭辞が追加されました。
`#elifdef`および`#elifndef`ディレクティブが追加されました。
その他の機能
IEEE 754(ISO/IEC 60559:2020)の現行版に対応し、拡張された二進浮動小数点数演算とオプショナルの十進浮動小数点数演算に対応しました。
`constexpr`指定子は定数宣言でのみ使用可能で、`constexpr`関数は認められません。
UTF-8で符号化されたデータを格納するための`char8_t`型が追加され、`u8`文字(列)リテラルの型が`char8_t`に変更されました。
複合リテラル定義で記憶域クラス指定子を使用することが許容されました。
廃止された機能
C23では、いくつかの古い機能が削除または非推奨となりました。
トライグラフが削除されました。
K&R形式の引数のない関数定義が削除されました。
2の補数以外の符号付き整数表現が削除され、符号付き整数は2の補数形式で表現することが必須となりました。
``の`_HAS_SUBNORM`マクロは非推奨となりました。
コンパイラの対応
以下のコンパイラはC23に実験的に対応しており、利用するためのオプションを提供しています。
GCC 9以降
Clang 9.0以降
Pelles C 11.00以降
利用可能な文書
C23の公式規格書は無料で入手できませんが、規格策定の過程で作成された以下の文書が公開されています。
N3096:C23規格策定前の最後の作業草案(無料入手可能)
N3149:C23規格の作業草案(非公開)
N3219:ISO/IEC 9899:2023 DIS 草案(ISO草案、有料)
N3220:C23後の最初の作業草案(N3219との違いは脚注の修正のみ、無料入手可能)
参考文献
N3096 (last freely-available working draft before C23); WG14; April 2023.
N3149 (working draft of C23 standard); WG14; July 2023.
N3219 (ISO/IEC 9899:2023 DIS Draft); WG14; February 2024.
ISO/IEC 9899:2024 (official C23 standard); ISO; 2024.
N3220 (first working draft after C23); WG14; February 2024.
関連項目
C++23、C++20、C++17、C++14、C++11、C++03、C++98 - C++の言語規格
C言語とC++の互換性
外部リンク
C Language WG14 (Working Group 14)
WG14 Document Repository
WG14 Meetings - agenda and minutes
WG14 Charters