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>
ヘッダーはコンパイラやライブラリの機能を把握する上で有用なヘッダーですが、その情報を適切に扱う必要があります。