最新C++(C++23)からみた最新C(C23)

プログラミング言語C++の次期仕様ISO/IEC 14882:2023(仮)、通称 **C++23** 発行が間近に迫る年の瀬、皆様いかがお過ごしでしょうか？

ところで、2023年にはプログラミング言語CもISO/IEC 9899:2023(仮)、通称 **C23** としてバージョンアップが計画されていることをご存じでしょうか？プログラミング言語の分類では「C/C++」と包括言及されることの多い両者ですが、実際にはどのくらい似ている／どれほど違うかを知っていますか？

この記事では、主にプログラミング言語C++からみたプログラミング言語Cのコア機能について超簡単に一覧紹介します。

※ C/C++標準ライブラリはあまりに差分が大きいため本記事では取り上げません。C標準ライブラリ機能は基本的にC++標準ライブラリに内包されます。


# C++23/C23両方にある機能
|機能名|概要|C++|C|
|:---|:---|:---|:---|
|`bool`型<br/>`true`/`false`|[真偽型と真偽値定数](https://zenn.dev/mod_poppo/articles/boolean-in-c)|C++当初から|C99以降<br/>C23改定[^bool]|
|`= {}`初期化|[空の初期化リストによる構造体／配列初期化](https://yohhoy.hatenadiary.jp/entry/20220917/p1)|C++当初から|C23以降|
|名前なし関数仮引数|関数引数で未使用パラメータ名を省略|C++当初から|C23以降|
|K&Rスタイル関数廃止|引数リストを明示しない関数宣言の廃止|C++当初から|C23以降|
|`static_assert`|コンパイル時アサーション|C++11以降<br/>[C++17改定](https://cpprefjp.github.io/lang/cpp17/extending_static_assert.html)|C99以降<br/>C23改定[^sa]|
|`thread_local`変数|スレッドローカル変数|C++11以降|C99以降<br/>C23改定[^tl]|
|`alignof`/`alignas`|アライメント取得／指定|C++11以降|C99以降<br/>C23改定[^align]|
|`nullptr`定数|[専用型によるヌルポインタ定数](https://yohhoy.hatenadiary.jp/entry/20220906/p1)|C++11以降|C23以降|
|属性構文(attribute)|[関数や変数への属性宣言](https://yohhoy.hatenadiary.jp/entry/20200505/p1)|C++11以降|C23以降|
|`auto`型推論|変数宣言における型推論|C++11以降|C23以降|
|式からの型情報取得|`decltype`(C++)<br/>[`typeof`/`typeof_unqual`](https://yohhoy.hatenadiary.jp/entry/20220912/p1)(C)|C++11以降|C23以降|
|`constexpr`変数|コンパイル時定数[^ce]|C++11以降|C23以降|
|列挙型の基底型指定|`enum E : T`|C++11以降|C23以降|
|2進数リテラル|[`0b`/`0B`プレフィクス](https://yohhoy.hatenadiary.jp/entry/20210228/p1)|C++14以降|C23以降|
|数値リテラル区切り|視認性のための区切り<code>'</code>|C++14以降|C23以降|
|`__has_include`|ヘッダファイル存在チェック|C++17以降|C23以降|
|指示付き初期化|[構造体メンバ名を指定した初期化](https://cpprefjp.github.io/lang/cpp20/designated_initialization.html)|C++20以降|C99以降|
|`#warning`|コンパイル時ユーザ定義警告|C++23以降|C23以降|
|`#elif(n)def`|[`#elif (not) defined(id)`](https://yohhoy.hatenadiary.jp/entry/20210604/p1)|C++23以降|C23以降|

[^bool]: C99言語機能では`_Bool`キーワードとして導入され、ヘッダ`stdbool.h`により`bool`型と`true`/`false`定数が有効となっていた。C23以降は常に`bool`/`true`/`false`として利用可能となる。
[^sa]: C99言語機能では`_Static_assert`キーワードとして導入され、ヘッダ`assert.h`により`static_assert`が有効となっていた。C23以降は常に`static_assert`として利用可能となる。またC23からC++17同様に第2引数を省略可能となる。
[^tl]: C99言語機能では`_Thread_local`キーワードとして導入され、ヘッダ`threads.h`により`thread_local`が有効となっていた。C23以降は常に`thread_local`として利用可能となる。
[^align]: C99言語機能では`_Alignas`/`_Alignof`キーワードとして導入され、ヘッダ`stdalign.h`により`alignas`/`alignof`が有効となっていた。C23以降は常に`alignas`/`alignof`として利用可能となる。
[^ce]: C23時点では変数への`constexpr`指定のみサポートされる。C++11以降のようなconstexpr関数はプログラミング言語Cでは継続検討となっている。


# C23にしかない機能
|機能名|概要|C++|C|
|:---|:---|:---|:---|
|`restrict`ポインタ|[エイリアシング最適化ヒント](https://yohhoy.hatenadiary.jp/entry/20120223/p1)|(未定)[^restrict]|C99以降|
|`_Generic`|[コンパイル時の型情報分岐](https://en.cppreference.com/w/c/language/generic)|(N/A)[^generic]|C11以降|
|`#embed`|[コンパイル時バイナリ埋込](https://yohhoy.hatenadiary.jp/entry/20220915/p1)|[C++26予定](https://github.com/cplusplus/papers/issues/700)|C23以降|
|`reproducible`属性<br/>`unsequenced`属性|[関数呼出の最適化ヒント](https://yohhoy.hatenadiary.jp/entry/20220909/p1)|(未定)[^pure]|C23以降|
|`_BitInt`型|任意ビット幅整数型|(未定)|C23以降|

[^restrict]: 2013年に関連話題を取り扱った提案 [N3635](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3635.pdf) が提出されている。また2018年に契約(Contract)を利用した相当機能提案 [P1296R0](https://www.open-std.org/JTC1/sc22/wg21/docs/papers/2018/p1296r0.pdf) が行われたが[進展なくクローズ済み](https://github.com/cplusplus/papers/issues/354)。
[^generic]: C++言語ではテンプレート(`template`)機能を用いて型情報分岐を実現する。
[^pure]: 2015年に類似機能の提案 [P0078R0](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0078r0.pdf) が提出されているが、2022年現在はC++側での進展なし。


# 参考資料
- [次期C標準 (C23) の内容が固まったらしい](https://zenn.dev/mod_poppo/articles/next-c-language)
- [cppreference.com - C23](https://en.cppreference.com/w/c/23)

## 🙇
Q. これはC++の記事というよりも、Cの記事ではないですか？
A. 「お前がそう思うんならそうなんだろう お前ん中ではな」