Prise en charge du C++ moderne dans DCMTK
Par défaut, DCMTK est compilé avec la prise en charge du C++11 activée (via CMAKE_CXX_STANDARD réglé sur 11). Cela améliore généralement les performances, car certaines opérations peuvent être effectuées de manière plus efficace, par exemple en exploitant la sémantique de déplacement.
Les normes C++ ultérieures peuvent être activées via le réglage CMAKE_CXX_STANDARD. Le fichier INSTALL de DCMTK décrit les versions disponibles de la norme C++ dont la compatibilité est connue pour la version de DCMTK concernée.
DCMTK peut encore être compilé avec un compilateur C++98. Cependant, la prise en charge du C++98 sera abandonnée à l'avenir.
Classes STL C++11
Bien que certaines fonctionnalités comme la sémantique de déplacement soient automatiquement activées dans le code existant lors d'une compilation avec le C++11 activé, les classes STL modernes du C++, comme std::unique_ptr, doivent être utilisées explicitement.
Comme DCMTK n'exige pas (encore) un compilateur compatible C++11, la boîte à outils fournit des classes d'encapsulation pour certaines de ces fonctionnalités STL. Chaque classe d'encapsulation correspond directement à la fonctionnalité C++11 équivalente (si elle est disponible, voir ci-dessous), ou fournit sinon une implémentation de repli en C++98. Par exemple, les classes STL C++11 suivantes sont implémentées de cette façon :
- std::unique_ptr (OFunique_ptr dans DCMTK)
- std::shared_ptr (OFshared_ptr dans DCMTK)
- std::numeric_limits (OFnumeric_limits dans DCMTK)
- std::tuple (OFtuple dans DCMTK)
- std::error_code (OFerror_code dans DCMTK)
Si vous souhaitez vous assurer que DCMTK utilise les versions STL de ces classes, un indicateur supplémentaire (en plus de l'activation de la version C++ correspondante) doit être défini lors de la configuration de CMake :
L'activation de l'indicateur DCMTK_ENABLE_STL garantit que, chaque fois que possible (c'est-à-dire lorsque le compilateur le prend correctement en charge), la version STL d'une classe est privilégiée par rapport à l'implémentation de repli.
Il existe plusieurs autres indicateurs permettant d'affiner ce comportement :
- DCMTK_ENABLE_STL_MEMORY : peut être utilisé pour activer std::unique_ptr et les classes associées.
- DCMTK_ENABLE_STL_MAP : peut être utilisé pour activer std::map [N.d.T. : l'original écrit « stl::map »].
- DCMTK_ENABLE_STL_... : d'autres indicateurs existent pour des fonctionnalités STL spécifiques. Ils sont facilement identifiables par leur préfixe.
Par défaut, ces indicateurs sont réglés sur "INFERRED", ce qui signifie qu'ils reprennent le réglage de DCMTK_ENABLE_STL. Cependant, si vous souhaitez seulement activer ou désactiver certaines fonctionnalités (c'est-à-dire vous écarter de DCMTK_ENABLE_STL), vous pouvez régler chacun d'eux explicitement sur "ON" ou "OFF".
Utiliser DCMTK avec le C++11
En compilant avec le C++11 ou une version ultérieure et en activant la STL, vous bénéficiez des avantages suivants :
- DCMTK peut utiliser les fonctionnalités C++11 disponibles au lieu de ses propres implémentations historiques. Celles-ci sont probablement plus efficaces et plus complètes.
- L'activation du C++11 fait désormais partie de la configuration de DCMTK, ce qui permet à DCMTK de vous aider à vérifier la (in)compatibilité API/ABI entre les compilations C++11 et non C++11.
Si vous essayez d'inclure une compilation de DCMTK avec le C++11 activé depuis un environnement non C++11, vous obtiendrez le message d'erreur suivant :
DCMTK was configured to use C++11 features, but your compiler does not or was
not configured to provide them.
Pour réduire la complexité de l'implémentation de DCMTK, le C++11 n'est utilisé que si votre compilateur se conforme d'assez près à la norme C++11. À notre connaissance, c'est actuellement le cas des compilateurs suivants :
- GNU C++ Compiler (g++) version 4.8.1 ou ultérieure.
- Clang (clang++) version 3.3 ou ultérieure.
- Selon la documentation Microsoft, Visual Studio 2019 version 16.8 (ou supérieure) avec le Windows SDK 10.0.20348.0 version 2104 (ou supérieure). DCMTK permet déjà d'activer le C++11 pour VS 2017, ce qui, d'après plusieurs retours, fonctionne également bien.
Lors d'une compilation avec le C++11 ou une version ultérieure, CMake effectue alors des vérifications de base pour s'assurer que le compilateur est correctement configuré et se conforme d'assez près à toutes les normes C++ modernes jusqu'à la version de norme sélectionnée.
Voici la sortie de CMake lors du réglage (réussi) de CMAKE_CXX_STANDARD sur 14 :
...
-- 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
Notre configuration GNU Autoconf reconnaît les options --enable-cxx11 et --disable-cxx11, qui permettent de configurer DCMTK pour utiliser les fonctionnalités du C++11. Si vous exécutez
configure --enable-cxx11
notre script Autoconf tentera de déterminer les indicateurs de compilation requis (le cas échéant) pour activer les fonctionnalités C++11, et exécutera des tests de configuration pour s'assurer que le compilateur se conforme d'assez près à la norme C++11. Si tout fonctionne, vous obtiendrez une sortie semblable à celle-ci :
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
Sinon, les fonctionnalités C++11 resteront désactivées, avec une sortie semblable à celle-ci :
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
Il existe d'autres options qui activent les fonctionnalités STL, comparables à la configuration CMake décrite ci-dessus :
--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- ....
La prise en charge de la définition de versions C++ postérieures au C++11 n'est pas encore disponible dans la configuration Autoconf de DCMTK.