DCMTK のモダン C++ サポート
DCMTK は既定で C++11 サポートを有効にしてコンパイルされます(CMAKE_CXX_STANDARD を 11 に設定)。一部の処理をより効率的に実行できるようになるため、たとえば ムーブセマンティクス を活用するなどして、通常は性能が向上します。
それ以降の C++ 標準は CMAKE_CXX_STANDARD 設定で有効にできます。各 DCMTK バージョンで動作が確認されている C++ 標準のバージョンは、DCMTK の INSTALL ファイルに記載されています。
DCMTK は今のところ C++98 コンパイラでもコンパイルできます。ただし、C++98 サポートは将来的に廃止される予定です。
C++11 STL クラス
ムーブセマンティクスのような一部の機能は、C++11 を有効にしてコンパイルすれば既存コードでも自動的に有効になりますが、std::unique_ptr のようなモダンな C++ STL クラスは明示的に使う必要があります。
DCMTK は(今のところ)C++11 対応コンパイラを必須としていないため、こうした STL 機能の一部についてはラッパークラスが用意されています。各ラッパークラスは、対応する C++11 機能が利用できる場合(後述)はそれに直接マッピングし、そうでなければ C++98 のフォールバック実装を提供します。たとえば、次の C++11 STL クラスがこの方式で実装されています。
- std::unique_ptr(DCMTK では OFunique_ptr)
- std::shared_ptr(DCMTK では OFshared_ptr)
- std::numeric_limits(DCMTK では OFnumeric_limits)
- std::tuple(DCMTK では OFtuple)
- std::error_code(DCMTK では OFerror_code)
DCMTK にこれらのクラスの STL 版を確実に使わせたい場合は、(対応する C++ バージョンを有効にするのに加えて)CMake の構成時に設定する追加のフラグがあります。
フラグ DCMTK_ENABLE_STL を有効にすると、可能な場合(つまりコンパイラが正しくサポートしている場合)は常に、フォールバック実装よりもクラスの STL 版が優先されます。
この動作を細かく調整するためのフラグも、いくつか用意されています。
- DCMTK_ENABLE_STL_MEMORY: std::unique_ptr と関連クラスを有効にできます。
- DCMTK_ENABLE_STL_MAP: stl::map を有効にできます。
- DCMTK_ENABLE_STL_...: 特定の STL 機能に対応するフラグがほかにもあります。いずれも接頭辞ですぐに見分けられます。
既定では、これらのフラグは "INFERRED" に設定されており、DCMTK_ENABLE_STL の設定をそのまま引き継ぎます。ただし、特定の機能だけを有効化または無効化したい場合(つまり DCMTK_ENABLE_STL と異なる設定にしたい場合)は、各フラグを明示的に "ON" または "OFF" に設定できます。
C++11 で DCMTK を使う
C++11 以降でコンパイルし、STL を有効にすると、次の利点が得られます。
- DCMTK が独自のレガシー実装ではなく、利用可能な C++11 機能を使えるようになります。こちらの方が効率的で完成度も高いはずです。
- C++11 の有効化が DCMTK の構成の一部になるため、C++11 ビルドと非 C++11 ビルドの間の API/ABI の(非)互換性を確認する際に DCMTK が手助けできるようになります。
C++11 を有効にした DCMTK ビルドを非 C++11 環境からインクルードしようとすると、次のエラーメッセージが表示されます。
DCMTK was configured to use C++11 features, but your compiler does not or was
not configured to provide them.
DCMTK の実装の複雑さを抑えるため、C++11 はコンパイラが C++11 標準に 厳密に準拠 している場合にのみ使われます。私たちの知る限り、現時点では次のコンパイラがこれに該当します。
- GNU C++ Compiler (g++) バージョン 4.8.1 以降。
- Clang (clang++) バージョン 3.3 以降。
- Microsoft のドキュメント によると、Windows SDK 10.0.20348.0 バージョン 2104(以降)を備えた Visual Studio 2019 バージョン 16.8(以降)。DCMTK では VS 2017 でも C++11 を有効にでき、こちらも問題なく動作するとの報告があります。
C++11 以降でコンパイルする場合、CMake はコンパイラが正しく構成され、選択した標準バージョンまでのすべてのモダン C++ 標準に十分厳密に準拠していることを確認するため、基本的なチェックを実行します。
次は CMAKE_CXX_STANDARD を 14 に(問題なく)設定したときの CMake の出力です。
...
-- Checking whether the compiler supports C++11
-- Checking whether the compiler supports C++11 -- yes
-- Checking whether the compiler supports C++14
-- Checking whether the compiler supports C++14 -- yes
...
GNU Autoconf
DCMTK の GNU Autoconf 設定は --enable-cxx11 と --disable-cxx11 のスイッチを認識します。これらは DCMTK で C++11 機能を使うよう構成するために利用できます。次のように実行すると
configure --enable-cxx11
Autoconf スクリプトは、C++11 機能を有効にするために必要なコンパイラフラグ(もしあれば)を判定し、コンパイラが C++11 標準に十分厳密に準拠していることを確認する構成テストを実行します。すべてうまくいけば、次のような出力が得られます。
checking whether to enable C++11 support...
checking whether c++ supports C++11 features by default... no
checking whether c++ supports C++11 features with -std=c++11... yes
checking whether to enable C++11 support... yes
そうでなければ、次のような出力とともに C++11 機能は無効のままになります。
checking whether to enable C++11 support...
checking whether c++ supports C++11 features by default... no
checking whether c++ supports C++11 features with -std=c++11... no
checking whether to enable C++11 support... no
上で説明した CMake の構成に相当する、STL 機能を有効にするスイッチもほかにあります。
--enable-stl use C++ STL
--disable-stl do not use C++ STL (default)
--enable-stl-vector use C++ STL vector
--disable-stl-vector do not use C++ STL vector
--enable-stl-algorithm use C++ STL algorithm
--disable-stl-algorithm do not use C++ STL algorithm- ....
C++11 より後の C++ バージョンを設定する機能は、DCMTK の Autoconf 設定ではまだ利用できません。