FAQ C++Consultez toutes les FAQ
Nombre d'auteurs : 34, nombre de questions : 368, dernière mise à jour : 14 novembre 2021 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur ou si vous souhaitez devenir rédacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
- Que faut-il savoir avant de commencer en C++ ?
- Combien de temps faut-il pour apprendre le C++ ?
- Dois-je apprendre le C avant le C++ ?
- Où trouver de la documentation de référence sur le C++ ?
- Où trouver un compilateur C++ ?
- Quel livre acheter ou lire ?
- Où puis-je trouver des cours à télécharger et à consulter ?
- Où trouver la solution des exercices du livre « Le langage C++ » de Stroustrup ?
- Au secours, à l'aide, j'ai une erreur ! Que faire ?
Vous avez décidé de vous lancer dans l'aventure C++ et nous vous en félicitons. Mais avant de démarrer votre apprentissage, il est bon de lire ce qui suit afin de partir sur de bonnes bases.
Le C++ est un langage dit « libre », c'est-à-dire non propriétaire, et soumis à une standardisation par un organisme indépendant : l'ISO (voir Le C++ est-il normalisé ?). Le but de ce standard est de permettre la portabilité d'un programme, moyennant la recompilation de son code source. Le C++ est en effet conçu pour être compilé en un exécutable spécifique à une plateforme donnée. On ne parle donc pas de script ni de commande C++, mais de code source et d'instruction. Le C++ n'est pas non plus un programme, un environnement ou un éditeur de logiciel. Ainsi, on ne développe pas avec le C++ de Microsoft, mais en C++ avec le compilateur de Microsoft.
Ce langage a été initialement développé comme extension du langage C par Bjarne Stroustrup au sein de Bell Labs, au début des années 1980. Ce dernier y a développé le premier compilateur C++ (nommé cfront), qui a évolué au fil du temps. Petit à petit, cette extension du C est devenue un langage à part entière, réellement différent du langage C. Aussi, ne vous y méprenez pas : programmer en C++ ne se résume pas à faire du C avec des classes, loin de là ! Ce sont deux langages très différents, qu'il faut distinguer. De plus, beaucoup de spécialistes s'accordent à dire qu'il n'est pas nécessaire d'apprendre le C avant le C++, voire même qu'il ne faut pas apprendre le C.
Ce n'est qu'en 1998 que le langage C++ a été normalisé, soit une quinzaine d'années après le début de son développement. Or, la communauté C++ était déjà très importante à ce moment et la plupart des compilateurs actuels existaient déjà (dans d'anciennes versions) et ne pouvaient donc pas respecter une norme postérieure à leur sortie. Chacun d'entre eux évoluant indépendamment des autres, on fait donc une distinction importante au niveau des compilateurs et de leur version, et non au niveau du langage (comme pour PHP4, PHP5…) qui reste toujours le même (celui défini par la norme).
Cela implique deux choses importantes :
- Un code C++ valide vis à vis de la norme peut parfaitement ne pas compiler sur la plupart des compilateurs, car utilisant des possibilités avancées du langage qui n'ont pas encore été implémentées ;
- Un code C++ invalide du point de vue de la norme peut être accepté par certains compilateurs peu rigoureux.
On peut néanmoins relativiser ces propos en précisant que dans l'ensemble, depuis quelques années, la majorité des compilateurs tend vers une conformité élevée avec la norme, voire totale. C'est pourquoi il faut veiller à en utiliser une version récente.
Cette situation peut un peu être comparée à celle des navigateurs web. Bien que le HTML/CSS soient standardisés, chaque navigateur propose des extensions qui lui sont propres, et ne respecte pas totalement le standard. Un code HTML valide peut donc produire un résultat différent en fonction du navigateur utilisé. Plus le navigateur est ancien, plus il sera difficile de lui faire accepter un code aux normes. À l'inverse, les navigateurs récents tendent à s'uniformiser autour des standards, et en implémentent de plus en plus de choses. En C++, c'est un peu la même chose. Il est facile de lier son code à un compilateur en particulier, en profitant des extensions de ce dernier. Et plus le compilateur est ancien, et moins il respecte le standard. C'est pourquoi on fait une distinction entre ce qui est portable, et ce qui ne l'est pas (la notion de portabilité incluant la compatibilité entre compilateurs).
Il existe un grand nombre de compilateurs. Certains sont Open Source (GCC, Open Watcom), et beaucoup d'autres sont commerciaux (Borland, Comeau, HP, IBM, Intel, Microsoft, SGI, Sun…). Le C++ étant simplement une norme, il n'y a pas d'implémentation de référence, ni même de site internet central comme c'est le cas pour des langages comme Python, Perl… Il n'y a donc pas non plus de documentation de référence autre que la norme elle même (voir Où trouver de la documentation de référence sur le C++ ? et Où puis-je obtenir une copie de la norme ?).
Cette norme couvre deux aspects :
- le langage lui même, c'est-à-dire sa syntaxe, etc. ;
- la bibliothèque standard qui l'accompagne.
Cette dernière est assez limitée au regard d'autres langages. En particulier en ce qui concerne l'interaction avec le système (afin de faciliter son implémentation). Ainsi, on ne peut pas faire grand chose de plus que des opérations élémentaires sur la console et les fichiers. La norme ne définit rien en ce qui concerne :
- la programmation réseau / internet ;
- le multitâche / la gestion de processus ;
- les interfaces graphiques ;
- le graphisme / multimédia ;
- etc.
Ceci explique en partie le manque d'empressement des développeurs de compilateurs à réaliser des outils qui respectent le standard à 100%. Ils ont généralement préféré investir dans la réalisation de bibliothèques et d'environnements comblant ces lacunes. De ce fait, on peut bien faire tout cela en C++, mais pas en C++ standard. Il faut avoir recours à des bibliothèques tierces, et pour chacun de ces domaines, le C++ est richement fourni, très richement même.
Ainsi, il n'y a pas une manière de développer des interfaces graphiques en C++, mais des dizaines (voir Comment créer une interface graphique en C++ ?), et aucune n'est standard.
On peut résumer les choses ainsi :
- ce qui est standard peut ne pas être portable à cause des anciens compilateurs encore utilisés. Mais un code standard est toujours préférable dans la mesure où c'est au compilateur de s'adapter pour parvenir à le compiler, quelle que soit la plateforme cible. Les principaux compilateurs modernes vont dans ce sens ;
- ce qui n'est pas standard peut malgré tout être rendu portable en adaptant le code pour qu'il compile sous plusieurs compilateurs / systèmes. C'est donc au code de s'adapter au compilateur, ce qui revient parfois à écrire plusieurs fois la même bibliothèque (une version pour Windows, une autre pour Linux…).
Sachez que la portabilité a un coût, notamment au niveau des fonctionnalités. Pour qu'une bibliothèque soit portable, on a intérêt à ce qu'elle utilise le moins possible les spécificités d'une plateforme donnée. Par exemple, pour réaliser une interface graphique, vous pouvez utiliser les MFC de Microsoft, uniquement avec le compilateur Visual C++ sous Windows. Ou alors vous pouvez utiliser Qt de Digia, qui compile avec Visual C++, mais aussi Borland C++ Builder, GCC… sous Windows, UNIX/Linux ou Mac. Pour que cela soit possible, elle a forcément fait l'impasse sur certaines spécificités de Windows absentes des autres OS (comme la base de registre…) alors que les MFC, plus proches du système, y donnent accès de manière directe. Alors, des MFC ou de Qt, laquelle est la meilleure ? À vous de le dire, en fonction de vos souhaits et de vos contraintes.
Les nombreuses bibliothèques tierces existantes se distinguent donc d'abord par le compromis qu'elles offrent entre portabilité et fonctionnalités. C'est l'antagonisme entre ces deux notions qui guidera votre choix de l'une d'entre elle, ainsi que les critères de coût, de pérennité, de documentation, etc.
Ayez donc bien à l'esprit ce qui est standard de ce qui ne l'est pas. Si vous demandez de l'aide à propos d'une bibliothèque C++ non standard sur un forum dédié au C++ standard, il est parfaitement normal que personne ne sache répondre, bien qu'il s'agisse de C++. Essayez de toujours vous orienter vers le forum le plus adapté à votre outil de développement.
Des sociétés arrivent à prodiguer des cours intensifs, où un semestre de cours de niveau universitaire est compressé en une semaine de 40 heures. Mais, indépendamment du lieu où vous suivrez vos cours, assurez-vous que les cours ont des séances 'pratiques', étant donné que la plupart des gens apprennent mieux en ayant des projets sur lesquels travailler et faire des essais. Mais même avec la meilleure formation, ils ne sont pas encore prêts.
Cela prend de 6 à 12 mois pour devenir productif au niveau Orienté Objet/C++, moins si les développeurs ont accès facilement à un groupe local d'experts, plus s'il n'y a pas de bonne bibliothèque à usage général de disponible. Devenir un de ces experts capable de guider les autres prend à peu près 3 ans.
Certaines personnes n'y arrivent jamais. Vous n'avez aucune chance à moins que vous n'acceptiez que l'on vous apprenne et que vous soyez motivé. Un minimum de réceptivité signifie que vous devez être capable de reconnaître quand vous vous êtes trompé. Un minimum de motivation signifie que vous devez être disposé à investir quelques heures supplémentaires (Il est nettement plus facile d'apprendre quelques nouveautés que de modifier votre paradigme [par ex., de changer votre façon de penser, la notion du bien, etc.])
Il y a deux choses que vous devriez faire :
- trouver un mentor, un guide ;
- fournir deux livres à vos élèves : un pour leur expliquer ce qui est légal, l'autre pour ce qui est moral.
et deux que vous ne devriez pas faire
- considérer le C comme un passage obligé pour apprendre le C++ ;
- considérer SmallTalk ou Java comme un passage obligé pour apprendre le C++.
Il s'agit sûrement de la question la plus posée et pour laquelle la réponse est sujette à une controverse interminable.
Il n'est pas nécessaire ni obligatoire de connaître le C pour faire du C++. Il est tout à fait possible et raisonnable d'apprendre le C++ directement.
Le C et le C++ sont deux langages différents qui n'ont pas la même notion d'abstraction : le C reste relativement proche de la logique de la machine et introduit des notions de gestion manuelle de la mémoire (entre autre) qui peuvent être particulièrement compliquées pour les néophytes; le C++ se suffit à lui même pour l'apprentissage des concepts fondamentaux.
Ainsi si vous ne connaissez pas encore la programmation et que vous souhaitez apprendre le C++, il est préférable d'apprendre à utiliser le C++ directement.
Les références les plus populaires sont :
- cpluplus resources : C++ Reference ;
- C/C++ Reference ;
- Le IBM information center (choisir XL C/C++ for AIX, V12.1 sur le coté gauche) ;
- La Microsoft MSDN Library contient aussi de nombreuses informations sur le C++, en particulier C++ Language and Standard Library et Standard C++ Library Reference.
Il y a aussi le standard lui même, dont on peut acheter une version PDF pour $18.
On peut également trouver les brouillons du comité standard concernant les évolutions passées et futures du C++ ( C++ Standards Committee Papers), dont un document assez complet concernant le standard C++ actuel ( Working draft, standard for programming language C++).
Vous pouvez en outre obtenir les sources du dernier brouillon de la norme, au format LaTeX sur github Ces sources sont les documents de travail utilisés par isocpp.org
Outils C/C++ reprend une liste de compilateurs téléchargeables gratuitement.
Vous pouvez aussi trouver des compilateurs en ligne :
- gcc.godbolt.org (Clang 3.0, 3.2 et 3.3, GCC 4.5.3 -> 4.9.0, Intel ICC 13.0.1) ;
- Stacked-Crooked (Clang 3.4, GCC 4.8.2) ;
- ideone.com (GCC 4.8.1).
Vous trouverez une liste de livres sur le C++ ainsi qu'un descriptif à leur sujet à cette adresse : Les meilleurs livres C++.
Un énorme travail de recherche à ce niveau a déjà été effectué et les résultats se trouvent ici : Les meilleurs Cours et Tutoriels C++
La solution des exercices du livre Le langage C++ est disponible ici : http://www.vandevoorde.com/C++Solutions/.
Commencez par dire laquelle ! Si vous vous contentez de dire que votre programme ne marche pas, que vous avez une erreur, personne ne pourra vous aider. Comme cela est stipulé dans les règles du forum, soyez précis et clair sur la nature de votre problème :
- erreur de compilation ou erreur d'exécution ;
- le message d'erreur rencontré ;
- si c'est une erreur de compilation, donnez le bout de code concerné ;
- si c'est une erreur d'exécution, localisez-la au moyen d'un débogueur.
Attention, un message d'erreur ne se borne pas à la première ligne en rouge que sort le compilateur : il est fréquemment accompagné par plusieurs lignes d'informations ô combien utiles situées selon les cas, avant ou après cette ligne en rouge. |
L'idéal pour espérer une réponse rapide est de donner un exemple complet minimal (ECM) de votre erreur, c'est-à-dire un petit programme le plus court possible que l'on peut copier-coller et compiler tel quel afin de constater le problème.
À question claire, réponse claire !
Avant de poser votre question, envisagez que vous n'êtes sûrement pas le premier à rencontrer cette erreur, pensez donc à utiliser votre moteur de recherche préféré. Vous aurez de bonnes chances de rapidement trouver des solutions de personnes ayant déjà résolu ce problème. Si vous n'y parvenez toujours pas, alors n'hésitez pas à poser votre question. Indiquer à la fin, comment vous avez pu résoudre votre problème afin que cela puisse servir à d'autres. |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.