Le programme
Voici le programme Hello World complet en C++. Appuyez sur Run pour le compiler et l'exécuter dans le navigateur :
Il affiche une ligne :
Hello, World!
Cinq lignes de code, et chacune a un rôle précis. Les sections ci-dessous les passent en revue dans l'ordre, puis expliquent comment compiler le même fichier sur votre propre ordinateur et ce que signifient en général les premières erreurs du compilateur.
Ligne par ligne
#include <iostream>
Les lignes qui commencent par # sont des instructions destinées au préprocesseur, qui s'exécute avant le compilateur proprement dit. #include <iostream> insère les déclarations de l'en-tête standard <iostream> (flux d'entrée et de sortie). C'est dans cet en-tête que sont déclarés std::cout et std::endl. Le C++ n'a pas d'instruction d'affichage intégrée ; l'affichage fait partie de la bibliothèque standard, et cette ligne vous y donne accès.
int main() {
Tout programme C++ commence son exécution par une fonction appelée main. Il doit y en avoir exactement une, et son nom doit être écrit en minuscules. Le int placé devant indique que main renvoie un entier au système d'exploitation quand elle se termine. Les parenthèses vides signifient qu'elle ne prend pas d'arguments ici, et l'accolade ouvrante { commence le corps de la fonction.
std::cout << "Hello, World!" << std::endl;
C'est cette ligne qui fait l'affichage.
std::coutest le flux de sortie standard, en général le terminal. Le préfixestd::indique quecoutse trouve dans l'espace de nomsstd, qui contient toute la bibliothèque standard.<<est l'opérateur d'insertion. Il envoie la valeur située à sa droite dans le flux situé à sa gauche. Vous pouvez l'enchaîner, et chaque<<ajoute l'élément suivant à la même sortie."Hello, World!"est un littéral de chaîne : du texte entre guillemets doubles.std::endltermine la ligne.- Le point-virgule termine l'instruction. Chaque instruction en C++ en a besoin.
return 0;
return termine main et renvoie une valeur au système d'exploitation. Par convention, 0 signifie que le programme a réussi, et tout autre nombre signale une erreur. Les scripts et les outils de build lisent ce code de sortie. Dans main, cette ligne est facultative : si l'exécution atteint l'accolade fermante, le C++ se comporte comme si vous aviez écrit return 0;.
L'accolade fermante
L'accolade fermante termine le corps de main, et avec lui le programme.
std::endl ou '\n'
Il existe deux façons courantes de terminer une ligne, et les deux apparaissent dans du vrai code :
Sortie :
Hello, World!
Hello again!
Line one
Line two
Le résultat visible est le même. La différence, c'est que std::endl écrit un saut de ligne puis vide le flux, ce qui envoie immédiatement au terminal tout le texte en attente dans le tampon. '\n' écrit seulement le saut de ligne, et le flux se vide à son propre rythme (au plus tard quand le programme se termine). Dans une boucle qui affiche des milliers de lignes, les vidages supplémentaires de std::endl font une différence mesurable ; c'est pourquoi beaucoup de programmeurs C++ utilisent '\n' par défaut et réservent std::endl aux cas où le texte doit apparaître tout de suite. La séquence d'échappement \n fonctionne aussi à l'intérieur d'une chaîne, comme le montre la troisième ligne. La page sur les entrées et sorties présente cout et cin plus en détail.
La version avec using namespace std;
Beaucoup de tutoriels écrivent Hello World ainsi :
using namespace std; indique au compilateur de chercher dans l'espace de noms std les noms qu'il ne trouve pas ailleurs, si bien que cout et endl fonctionnent sans le préfixe. C'est acceptable pour de petits programmes et des exercices. Dans du code plus volumineux et dans les fichiers d'en-tête, on l'évite en général, parce qu'il importe des centaines de noms standard qui peuvent entrer en conflit avec les vôtres (une de vos fonctions appelée count ou distance, par exemple). Écrire std::cout coûte cinq caractères et supprime le risque.
Compiler et exécuter Hello World sur votre ordinateur
L'éditeur du navigateur compile à votre place. Sur votre propre machine, vous faites vous-même les deux mêmes étapes : compiler le fichier source en exécutable, puis lancer l'exécutable. Il vous faut d'abord un compilateur C++ installé ; le guide d'installation explique comment en configurer un sous Windows, macOS et Linux.
Enregistrez le programme sous hello.cpp, ouvrez un terminal dans le même dossier et compilez-le :
g++ hello.cpp -o hello
Si rien ne s'affiche, c'est que tout a fonctionné, et il y a maintenant un exécutable appelé hello (hello.exe sous Windows) à côté du fichier source. Lancez-le :
./hello
Sous Windows, lancez plutôt hello.exe ou simplement hello. Sous macOS, clang++ hello.cpp -o hello fonctionne de la même façon, et g++ y est généralement Clang sous un autre nom.
Deux options valent la peine d'être ajoutées dès le départ : -std=c++17 (ou -std=c++20) choisit la norme du langage, et -Wall -Wextra active des avertissements qui détectent de vraies erreurs :
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello
La page sur la compilation en C++ explique ce que font ces options, ce que signifie -o, et pourquoi vous obtenez un fichier appelé a.out sans elle.
Les premières erreurs courantes
Les messages d'erreur ci-dessous viennent de GCC (g++). Clang formule ses messages autrement mais désigne la même ligne.
Point-virgule manquant.
hello.cpp:5:5: error: expected ';' before 'return'
Le compilateur ne remarque le ; manquant qu'en atteignant l'élément suivant, donc le numéro de ligne désigne souvent la ligne qui suit l'erreur. Vérifiez la fin de la ligne précédente.
#include <iostream> manquant.
error: 'cout' is not a member of 'std'
std::cout est déclaré dans <iostream>. Ajoutez l'include en haut du fichier.
std:: manquant.
error: 'cout' was not declared in this scope; did you mean 'std::cout'?
Écrivez std::cout et std::endl, ou ajoutez using namespace std; après l'include.
Main au lieu de main. Le C++ est sensible à la casse. Un programme avec int Main() compile, puis échoue à l'édition de liens avec undefined reference to 'main', parce que l'éditeur de liens ne trouve pas la fonction par laquelle le programme est censé commencer.
Compiler avec gcc au lieu de g++. gcc hello.cpp compile le code C++ mais ne lie pas la bibliothèque standard du C++, et vous obtenez une longue liste d'erreurs undefined reference to std::.... Utilisez g++ (ou clang++) pour les fichiers C++.
Guillemets typographiques. Du code copié depuis un traitement de texte ou une page web peut contenir des guillemets typographiques (“Hello”) au lieu de guillemets droits ("Hello"). GCC signale alors stray '\342' in program. Retapez les guillemets dans votre éditeur.
Anciens en-têtes et void main. Certains très vieux tutoriels utilisent #include <iostream.h> ou void main(). Aucun des deux n'est du C++ standard : l'en-tête est <iostream>, sans .h, et main doit renvoyer int. Les compilateurs modernes refusent les deux.
Afficher avec std::println en C++23
Le C++23 a ajouté une façon plus courte d'afficher une ligne, std::println, fournie par l'en-tête <print> :
#include <print>
int main() {
std::println("Hello, World!");
}
Elle ajoute le saut de ligne pour vous et accepte des marqueurs {} pour insérer des valeurs. Elle est prise en charge à partir de GCC 14, de Clang 18 avec libc++ et des versions récentes de Visual Studio, et nécessite -std=c++23. La plupart du code et des tutoriels existants utilisent encore std::cout, il vaut donc la peine de maîtriser les deux.
Questions fréquentes
Comment écrire Hello World en C++ ?
Commencez par #include <iostream>, puis définissez int main() et placez à l'intérieur std::cout << "Hello, World!" << std::endl;, suivi de return 0;. Enregistrez le fichier sous hello.cpp, compilez-le avec g++ hello.cpp -o hello, puis lancez ./hello.
Pourquoi Hello World en C++ a-t-il besoin de #include <iostream> ?
std::cout et std::endl sont déclarés dans l'en-tête <iostream>, ils ne font pas partie du langage lui-même. Sans cet include, le compilateur ne connaît pas ces noms et s'arrête sur une erreur comme 'cout' is not a member of 'std'.
Quelle est la différence entre std::endl et '\n' ?
Les deux terminent la ligne. std::endl vide en plus le tampon de sortie, ce qui force l'affichage immédiat du texte. '\n' écrit seulement le saut de ligne et laisse le flux se vider quand il est prêt, ce qui est plus rapide quand vous affichez beaucoup de lignes. Pour une seule ligne de Hello World, il n'y a aucune différence visible.
Faut-il écrire return 0 à la fin de main en C++ ?
Non. main est la seule fonction où le C++ permet d'omettre le return ; atteindre l'accolade fermante équivaut à return 0;, ce qui indique au système d'exploitation que le programme a réussi. Beaucoup de développeurs l'écrivent quand même pour rendre le code de sortie explicite.