C++/標準ライブラリ/version
はじめに
[編集]<version>ヘッダーは、C++20から導入された標準ライブラリヘッダーです。このヘッダーには、標準ライブラリの実装依存の情報や、ライブラリの機能テストマクロが定義されています。
<version>ヘッダーの目的
[編集]実装依存の標準ライブラリ情報の取得
[編集]<version>ヘッダーを含むことで、標準ライブラリの実装依存の情報を取得できます。この情報には、ライブラリのバージョン番号や、実装ベンダー固有の定義などが含まれる可能性があります。
ライブラリ機能テストマクロの定義
[編集]<version>ヘッダーを含むと、全てのライブラリ機能テストマクロが定義されます。これらのマクロを使うことで、使用している標準ライブラリが特定の機能をサポートしているかどうかを判断できます。
実装依存の標準ライブラリ情報
[編集]<version>ヘッダーには、標準で定められた実装依存の情報は含まれていません。代わりに、各実装ベンダーが独自に定義したマクロが存在する可能性があります。例えば、ライブラリのバージョン番号を表すマクロなどです。
ライブラリ機能テストマクロ
[編集]概要
[編集]ライブラリ機能テストマクロは、標準ライブラリの特定の機能が使用可能かどうかをコンパイル時に判断するためのマクロです。これらのマクロが定義されていれば、その機能が使用できることを示します。
C++20で定義されたマクロ一覧
[編集]C++20で新たに定義されたライブラリ機能テストマクロは以下の通りです。
__cpp_lib_addressof_constexpr__cpp_lib_allocator_traits_is_always_equal__cpp_lib_array_constexpr__cpp_lib_bind_front__cpp_lib_bitops__cpp_lib_bounded_array_traits__cpp_lib_checked_iterator__cpp_lib_concepts__cpp_lib_constexpr_algorithms__cpp_lib_constexpr_complex__cpp_lib_constexpr_functional__cpp_lib_constexpr_iterator__cpp_lib_constexpr_memory__cpp_lib_constexpr_numeric__cpp_lib_constexpr_string__cpp_lib_constexpr_string_view__cpp_lib_constexpr_tuple__cpp_lib_constexpr_utility__cpp_lib_constexpr_vector__cpp_lib_destroying_delete__cpp_lib_endian__cpp_lib_erase_remove__cpp_lib_generic_byteswap__cpp_lib_generic_unary_traits__cpp_lib_integer_sequence__cpp_lib_interpolate__cpp_lib_is_constant_evaluated__cpp_lib_is_final__cpp_lib_is_nothrow_convertible__cpp_lib_is_referenceable__cpp_lib_list_remove_return_type__cpp_lib_math_special_functions__cpp_lib_ranges__cpp_lib_remove_reference_traits__cpp_lib_robust_against_string_viewposition_error__cpp_lib_shift__cpp_lib_source_location__cpp_lib_span__cpp_lib_ssize__cpp_lib_starts_ends_with__cpp_lib_stdatomic_h__cpp_lib_three_way_comparison__cpp_lib_to_address__cpp_lib_to_array__cpp_lib_type_identity
この一覧には、概念(Concepts)、Range、スパン(Span)、特殊数学関数、3方向比較演算子など、C++20で導入された主要な機能に対応するマクロが含まれています。
マクロの利用例
[編集]#include <vector> int main() { #if __cpp_lib_erase_remove >= 202110L std::vector<int> v = {1, 2, 3, 4, 5}; auto last = std::erase(v, 3); // C++23の機能を使用 v.erase(last, v.end()); #endif return 0; }
旧来の手法との比較
[編集]<ciso646>ヘッダーの説明
[編集]C++11以前では、<ciso646>ヘッダーを含むことで、いくつかのライブラリ機能テストマクロが定義されていました。しかし、これには標準で定められたマクロしか含まれておらず、実装依存の情報を取得することはできませんでした。
<version>ヘッダーの利点
[編集]<version>ヘッダーを使えば、ライブラリの実装依存の情報とライブラリ機能テストマクロの両方を取得できます。このため、<ciso646>ヘッダーに比べてより多くの情報が得られます。また、ライブラリ機能テストマクロも最新のものが定義されるため、旧来のマクロに比べて網羅性が高くなっています。
注意点
[編集]実装依存性
[編集]<version>ヘッダーに含まれる実装依存の情報は、標準で規定されていません。つまり、ライブラリのバージョンを表すマクロの有無や、名前、値の形式などがベンダーによって異なる可能性があります。このため、このような実装依存の情報に頼る際は注意が必要です。
また、ベンダーが独自に定義した機能テストマクロについても、同様の問題があります。
マクロの有効範囲
[編集]<version>ヘッダーで定義されるマクロは、そのヘッダーをインクルードした箇所から、それ以降の全てのコード領域で有効になります。したがって、特定の領域でのみマクロを有効/無効にするような使い方はできません。
まとめ
[編集]<version>ヘッダーは、標準ライブラリの実装依存の情報や、ライブラリの機能テストマクロを取得するためのヘッダーです。従来の<ciso646>に比べて、より多くの情報を得られます。
一方で、実装依存の情報はベンダーによって異なるため、注意が必要です。また、マクロの有効範囲についても留意する必要があります。
<version>ヘッダーはコンパイラやライブラリの機能を把握する上で有用なヘッダーですが、その情報を適切に扱う必要があります。