プログラミング言語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. 「お前がそう思うんならそうなんだろう お前ん中ではな」
-
C99言語機能では
_Bool
キーワードとして導入され、ヘッダstdbool.h
によりbool
型とtrue
/false
定数が有効となっていた。C23以降は常にbool
/true
/false
として利用可能となる。 ↩ -
C99言語機能では
_Static_assert
キーワードとして導入され、ヘッダassert.h
によりstatic_assert
が有効となっていた。C23以降は常にstatic_assert
として利用可能となる。またC23からC++17同様に第2引数を省略可能となる。 ↩ -
C99言語機能では
_Thread_local
キーワードとして導入され、ヘッダthreads.h
によりthread_local
が有効となっていた。C23以降は常にthread_local
として利用可能となる。 ↩ -
C99言語機能では
_Alignas
/_Alignof
キーワードとして導入され、ヘッダstdalign.h
によりalignas
/alignof
が有効となっていた。C23以降は常にalignas
/alignof
として利用可能となる。 ↩ -
C23時点では変数への
constexpr
指定のみサポートされる。C++11以降のようなconstexpr関数はプログラミング言語Cでは継続検討となっている。 ↩ -
2013年に関連話題を取り扱った提案 N3635 が提出されている。また2018年に契約(Contract)を利用した相当機能提案 P1296R0 が行われたが進展なくクローズ済み。 ↩
-
C++言語ではテンプレート(
template
)機能を用いて型情報分岐を実現する。 ↩