C++

From CC Doc
Jump to: navigation, search
This page is a translated version of the page C++ and the translation is 100% complete.

Other languages:
English • ‎français

C++

C ++ est un langage de programmation multiparadigme et généraliste de haut niveau créé en 1979 chez Bell Labs par Bjarne Stroustrup, dans le but d'apporter certaines améliorations au langage C. Il existe aujourd'hui des normes ISO qui ont été établies en 1998 (C++98), 2003 (C++03), 2011 (C++11) et 2014 (C++14); une version est attendue en 2017. Pour en apprendre plus sur le langage et sur l'impact des correctifs et amendements, voyez les liens suivants  :

  • C++, historique, C++98.
  • C++03, modifications mineures (correction de bogues); std::vector stocke ses éléments en contigu.
  • C++11, mise à jour majeure, ajout du modèle de mémoire et des fonctionnalités de concurrence (multifil, atomics, compare-and-swap).
  • C++14, correction de bogues, légères améliorations, simplification et généralisation d'outils comme constexpr, auto, lambdas (par exemple move capture).
  • C++17: prochaine version majeure avec entre autres l'ajout possible de fonctionnalités pour les algorithmes STL parallèles.

La documentation complète et à jour est disponible sur la page Wiki cppreference. Ces liens peuvent conduire à des pages qui contiennent des erreurs. Le document officiel peut être commandé auprès du Conseil canadien des normes.

Typiquement, les normes ISO se basent sur d'autres normes; c'est le cas aussi pour les normes C++, qui adoptent les définitions des normes ISO pour C en ce qui a trait entre autres au texte et aux restrictions. Vous pouvez donc vous procurer le document officiel pour la norme C auprès du Conseil canadien des normes.

Meilleurs modèles de mémoire et de concurrence

Ces modèles sont apparus avec la norme ISO de 2011; il n'y avait au préalable aucune gestion des accès concurrents à la mémoire en lecture et en écriture et cet aspect n'est pas toujours documenté par le fournisseur du compilateur. Nous recommandons de compiler en C++11 ou plus.

Compilateurs

Spécificités des langages

Les divers compilateurs traitent les langages différemment. Malheureusement, plusieurs versions de compilateurs ne supportent que partiellement les normes C++ particulières, ce qui est décevant. Consultez ce tableau pour la liste des versions correspondant aux fonctionnalités du langage ainsi que des liens vers les sites Web de chaque compilateur.

Bibliothèque standard

Plusieurs compilateurs C++ sous Linux ne supportent pas la bibliothèque standard C++ avec certains systèmes d'exploitation (surtout Linux). Ces compilateurs utilisent la bibliothèque qui est installée; la bibliothèque libstdc++ de GCC est donc typiquement utilisée.

Note : Il ne faut pas vous inquiéter; ceci explique pourquoi les compilateurs C++ autres que ceux de GCC doivent être configurés par un administrateur afin que la bonne version de libstdc++ puisse être utilisée, car plusieurs versions de GCC (et donc de libstdc++) sont installées sur les systèmes de Calcul Canada. Une configuration incorrecte peut apporter des problèmes. Pour cette raison également, pour compiler leurs applications, les utilisateurs ne doivent pas coder en dur (hard code) les chemins vers les bibliothèques installées par les administrateurs.

La documentation GCC comprend une section sur les composantes de la bibliothèque standard supportées par libstdc++.

Sources d'information

Un point de départ pour se familiariser avec C++ est la page Get Started; tous les ouvrages qui y sont mentionnés sont excellents.

Pour ce qui a trait à C++11 (multifil, atomics, variables-conditions, etc.), nous recommandons C++ Concurrency in Action: Practical Multithreading.

Pièges

Mot-clé volatile

Le modificateur volatile a un sens très particulier en C et C++ comme vous le constaterez en lisant cette page. L'emploi de ce modificateur est toutefois rare.

volatile est employé incorrectement, car on le confond avec le volatile Java qui n'a pas du tout le même sens. Le mot-clé Java volatile correspond en C++ à std::atomic<T> pour un type T ou std::atomic_*, où l'astérisque représente un nom de type fondamental tel que int.

NOTE : Vous n'aurez probablement jamais besoin de volatile en C++, sauf peut-être dans un contexte de code concurrent datant d'avant la norme ISO C++11, ce qui serait cependant un cas rare. Utilisez plutôt les fonctionnalités mutex, atomic ou autres de votre bibliothèque (par exemple pthreads ou la bibliothèque standard C++).

Compilateurs

GCC

O3

L'option -O3 comprend des améliorations possiblement dangereuses pour certains codes, par exemple ceux comprenant des fonctions de crénelage (aliasing). En cas de doute, utilisez plutôt l'option -O2. Si vous avez le temps, lisez la page man (par exemple man g++) et cherchez -O3; vous pouvez ainsi désactiver les paramètres qui ne sont pas sûrs.

Liens avec des binaires déjà compilés

Une modification importante a été introduite à l'interface binaire-programme (ABI) entre les versions 4.9 et 5.1 du GCC. Aucun problème ne survient si tout le code source incluant les bibliothèques dépendantes sont compilés avec la même version du compilateur. Par contre, l'utilisation de versions différentes peut empêcher les liens de se faire correctement en raison de cette modification, surtout si les liens se font vers des bibliothèques précompilées offertes par les produits de fournisseurs externes. Dans un tel cas, utilisez la fonction Dual ABI[1] pour que les liens se fassent de façon appropriée avec l'ancienne interface ABI. Il faudrait donc par exemple passer -D_GLIBCXX_USE_CXX11_ABI=0 au GCC si vous utilisez une version supérieure à 5.1.

La page GCC C++ Dual ABI présente un exemple de l'effet sur l'ABI de diverses options de commandes de ligne GCC.

Intel

Les compilateurs C et C++ d'Intel risquent de causer des difficultés dans le cas d'opérations avec virgule flottante. Prenez connaissance des pages man Intel (par exemple man icpc) et utilisez les options -fp-model precise ou -fp-model source pour respecter les normes ANSI, ISO et IEEE. Pour plus d'information, consultez ce document.

Références

  1. Free Software Foundation. The GNU C++ Library, Chapter 3. https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

GNU Compiler Collection, an open source compiler collection