LoginSignup
40
18

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-05

プログラミング言語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
true/false
真偽型と真偽値定数 C++当初から C99以降
C23改定1
= {}初期化 空の初期化リストによる構造体/配列初期化 C++当初から C23以降
名前なし関数仮引数 関数引数で未使用パラメータ名を省略 C++当初から C23以降
K&Rスタイル関数廃止 引数リストを明示しない関数宣言の廃止 C++当初から C23以降
static_assert コンパイル時アサーション C++11以降
C++17改定
C99以降
C23改定2
thread_local変数 スレッドローカル変数 C++11以降 C99以降
C23改定3
alignof/alignas アライメント取得/指定 C++11以降 C99以降
C23改定4
nullptr定数 専用型によるヌルポインタ定数 C++11以降 C23以降
属性構文(attribute) 関数や変数への属性宣言 C++11以降 C23以降
auto型推論 変数宣言における型推論 C++11以降 C23以降
式からの型情報取得 decltype(C++)
typeof/typeof_unqual(C)
C++11以降 C23以降
constexpr変数 コンパイル時定数5 C++11以降 C23以降
列挙型の基底型指定 enum E : T C++11以降 C23以降
2進数リテラル 0b/0Bプレフィクス C++14以降 C23以降
数値リテラル区切り 視認性のための区切り' C++14以降 C23以降
__has_include ヘッダファイル存在チェック C++17以降 C23以降
指示付き初期化 構造体メンバ名を指定した初期化 C++20以降 C99以降
#warning コンパイル時ユーザ定義警告 C++23以降 C23以降
#elif(n)def #elif (not) defined(id) C++23以降 C23以降

C23にしかない機能

機能名 概要 C++ C
restrictポインタ エイリアシング最適化ヒント (未定)6 C99以降
_Generic コンパイル時の型情報分岐 (N/A)7 C11以降
#embed コンパイル時バイナリ埋込 C++26予定 C23以降
reproducible属性
unsequenced属性
関数呼出の最適化ヒント (未定)8 C23以降
_BitInt 任意ビット幅整数型 (未定) C23以降

参考資料

🙇

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

  1. C99言語機能では_Boolキーワードとして導入され、ヘッダstdbool.hによりbool型とtrue/false定数が有効となっていた。C23以降は常にbool/true/falseとして利用可能となる。

  2. C99言語機能では_Static_assertキーワードとして導入され、ヘッダassert.hによりstatic_assertが有効となっていた。C23以降は常にstatic_assertとして利用可能となる。またC23からC++17同様に第2引数を省略可能となる。

  3. C99言語機能では_Thread_localキーワードとして導入され、ヘッダthreads.hによりthread_localが有効となっていた。C23以降は常にthread_localとして利用可能となる。

  4. C99言語機能では_Alignas/_Alignofキーワードとして導入され、ヘッダstdalign.hによりalignas/alignofが有効となっていた。C23以降は常にalignas/alignofとして利用可能となる。

  5. C23時点では変数へのconstexpr指定のみサポートされる。C++11以降のようなconstexpr関数はプログラミング言語Cでは継続検討となっている。

  6. 2013年に関連話題を取り扱った提案 N3635 が提出されている。また2018年に契約(Contract)を利用した相当機能提案 P1296R0 が行われたが進展なくクローズ済み

  7. C++言語ではテンプレート(template)機能を用いて型情報分岐を実現する。

  8. 2015年に類似機能の提案 P0078R0 が提出されているが、2022年現在はC++側での進展なし。

40
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
18