1.1 Compiler et exécuter un premier programme en C++, sous

Transcription

1.1 Compiler et exécuter un premier programme en C++, sous
1.1- Compiler et exécuter un premier programme en C++
1- Un premier programme en C++
2- Compilation et exécution
1- Un premier programme en C++
Le premier programme que propose le cours consiste à afficher "HelloWorld" dans l'invite de commandes. Le code
source pour une telle opération est le suivant :
#include<iostream>
using namespace std;
int main()
{
cout << "HelloWorld";
return 0;
}
Les sauts de lignes ou les tabulations ne sont pas nécessaires, de même que les espaces, sauf pour les lignes qui
commencent par # qui sont des instructions destinées au préprocesseur et les lignes qui commencent par // et qui servent à
introduire des commentaires. Ainsi, le code précédent est absolument équivalent à ce code :
#include<iostream>
using namespace std;int main(){std::cout << "HelloWorld";return 0;}
La séparation en différentes lignes ou l'introduction de tabulations ne sont faites que pour faciliter la lecture du code.
Noter que chaque instruction est terminée par ';', sauf celles destinées au préprocesseur. On remarque également la présence
des accolades qui séparent des blocs d'instructions.
Reprenons ce code ligne à ligne :
#include<iostream>
Les lignes qui commencent par # sont des instructions à destination du préprocesseur. Au chapitre 1.7, on détaillera
précisément le rôle du préprocesseur. On peut juste retenir pour l'instant qu'il est lancé au moment de la compilation du code,
avant l'étape de compilation effective. Ici, l'instruction consiste à inclure une librairie, la librairie iostream. L'inclusion de librairies
est en élément central en C++ (cf introduction). En incluant une librairie, on peut en utiliser les fonctions, les constantes et les
objets. Dans iostream i=>input, o=>output. La librairie permet donc de gérer des flux d'entrées et de sorties. Notamment elle
fournit un objet std::cout qui est un flux vers l'invite de commandes et qui permet d'écrire sur l'invite de commandes. L'insertion
du nom du fichier entre deux < > indique à la machine d'aller chercher ce fichier à un emplacement spécial, un emplacement où
sont présents un certain nombre d'autres fichiers sources pré-implémentés et prévus par la norme. En effet iostream est une
librairie de la norme C++ standard.
using namespace std;
L'instruction sert à spécifier que l'on utilise l'espace de noms std. De sorte, que si la machine trouve cout, et qu'elle ne peut
identifier cout ni comme un nom de variable, ni comme un nom de fonction, elle pourra tester si elle peut résoudre l'identifieur
(nom de fonction ou de variable) std::cout. Si on avait pas mis cette instruction, plutôt que cout << "Hello world";, il aurait fallu
mettre l'instruction std::cout << "Hello world";.
int main()
On annonce ici qu'on va définir la fonction main qui est la fonction principale du programme. Lors de l'exécution du programme,
le système d'exploitation appelle l'exécution de la fonction main(). Toute autre fonction exécutée dans le programme sera soit
appelée par main(), soit appelée par une fonction elle même appelée par main(), soit appelée par une fonction appelée par une
fonction appelée par main() etc.... La fonction main() renvoie un entier dans la norme C++.
cout << "HelloWorld";
Ici cout est un objet. Cet objet fait partie de la bibliothèque standard, on peut le manipuler puisqu'on a inclus la librairie iostream.
<< est un opérateur de redirection de sortie. L'objet cout est un flux de sortie vers l'interface courante utilisée par le
programmeur. En l'occurrence, l'invite de commandes sous Windows ou le shell sous Linux. Donc, l'instruction permet d'écrire
"HelloWorld" sur l'invite de commande ou le shell. L'instruction
std::cout << "HelloWorld";
aurait produit le même résultat. Par contre, si on n'avait pas précisé auparavant using namespace std;, on n'aurait pas eu le
choix, il aurait fallu utiliser la dernière instruction.
return 0;
Comme la fonction main() est déclarée comme renvoyant un entier, il faut lui faire renvoyer une valeur : 0 indique au système
appelant la fonction que l'exécution s'est déroulée sans erreur. Du point de vue du programmeur, il serait équivalent de
renvoyer n'importe quelle valeur entière. A noter que le code aurait pu fonctionner sans cette instruction.
Pour créer un fichier de code source à partir du code donné plus haut, on saisit le code qui est proposé plus haut et on
le saisit dans un éditeur de texte (notepad sous Windows, gedit sous Linux etc...). Il suffit ensuite d'enregistrer le fichier au
format cpp. Sous notepad, il faut donc bien mettre "T.cpp" (ne pas omettre les guillemets sous notepad) dans la barre de saisie
du nom de fichier.
Un premier fichier source a été crée. Il va maintenant falloir le compiler.
2- Compilation et exécution
Compilation et exécution sous Windows
La compilation consiste à produire un fichier exécutable à partir d'un fichier de code source (ou plusieurs fichiers de
code source). Plusieurs compilateurs sont disponibles. Dans ce qui suit, on propose d'en utiliser un qui est lié à un EDI
(Environnement de Developpement Intégré) librement disponible : Dev-C++.
Une fois cet EDI téléchargé, on peut l'utiliser pour ouvrir le fichier qui a été précédemment créé.
On constate que l'affichage se fait avec des couleurs, ceci pour faciliter la compréhension du code.
●
En vert : les informations à destination du préprocesseur qui apparaissent en haut du document.
●
En noir et gras : les mots clés du langage
●
En noir les instructions (dont les mots clés du langage qui apparaissent en gras)
●
En rouge les chaînes de caractères.
●
En violet les valeurs
A partir de là, les modifications seront faites à partir de l'EDI, de même que la création de fichiers. Une fois le fichier de code
source ouvert dans le navigateur, on peut compiler ce code. Sous Dev-C++ cela se fait avec CTRL+F9 (ou via le menu). Un
fichier T.exe apparaît dans le même répertoire que le fichier source T.cpp. Reste à exécuter le code qui vient d'être produit.
Pour se faire, on utilise l'invite de commande (Démarrer-Accessoires).
Une commande est toujours un fichier (quelque soit le système d'exploitation). Si par exemple j'utilise la commande ping, elle
est comprise :
C:\Documents and Settings\utilisateur>ping 129.12.12.0
La commande ping a pour nom complet : c:\WINDOWS\system32\ping, on peut trouver le fichier qui correspond à la
commande. A un moment donné du temps, le système d'exploitation pointe sur un nombre de répertoires. Lorsqu'on appelle
une commande, un fichier exécutable, la machine cherche parmi tous les répertoires sur laquelle elle pointe et dans le
répertoire courant : c:\Documents and Settings\utilisateur dans la commande précédente. En général, le fichier exécutable n'est
pas dans un fichier que la machine explore par défaut. Donc, supposons que mon exécutable soit dans c:\CPP, pour l'exécuter,
je fais :
C:\Documents and Settings\utilisateur>c:\CPP\T
Ce qui exécute le code. Une autre solution consiste à se placer d'abord dans le répertoire c:\CPP :
C:\Documents and Settings\utilisateur>cd c:\CPP
C:\CPP>T
La première instruction cd c:\CPP : cd signifie "change directory" : on change le répertoire de référence pour avoir c:\CPP
comme nouveau répertoire de référence. Il suffit ensuite de taper le nom de l'exécutable.
Note : on aurait également pu lancer le fichier .exe en double cliquant dessus, mais la fenêtre d'exécution qui est ouverte par
Windows pour l'affichage de l'exécution est fermée dès que cette exécution est terminée. C'est pour cette raison que l'on ouvre
d'abord l'invite de commande.
Compilation et exécution sous Linux
On suppose que le compilateur classique gcc est installé sur la machine Linux (il s'agit du compilateur le plus présent
sur les machines Linux). On utilise le compilateur g++ (compilateur C++ qui fait partie de gcc).
On suppose que $PATH pointe effectivement sur le répertoire qui contient la commande g++. Donc, on invoque le
shell de commandes. On suppose que le fichier contenant le code est test.cpp (le même code que celui qui précède). On
suppose que le chemin complet de ce fichier est /home/dorat/test.cpp. A partir de là, deux solutions sont possibles :
SOL1 :
Soit on se place dans le répertoire qui contient le fichier :
cd /home/dorat/
Ensuite on peut lancer la compilation :
g++ test.cpp
Dans ce cas, on constate qu'un fichier a.out a été créé dans le répertoire courant. Pour l'exécuter :
./a.out
qui signifie : exécuter la commande a.out qui est dans le répertoire courant. L'exécution aura aussi pu être faite par :
/home/dorat/a.out
Dans ce cas, on donne le chemin absolu de la commande.
On peut vouloir donner un autre nom que a.out (ainsi qu'un autre chemin pour le fichier de destination) :
g++ test.cpp -o /home/dorat/executables/hello.out
Dans ce cas, le fichier exécutable créé sera /home/dorat/executables/hello.out
Ne reste plus qu'à voir le cas où on lance la compilation depuis un autre répertoire que celui dans lequel est le fichier. Dans ce
cas, depuis n'importe quel répertoire :
g++ /home/dorat/test.cpp -o /home/dorat/executables/hello.out
et son exécution depuis n'importe quel répertoire :
/home/dorat/executables/hello.out
Différents compilateurs
Il existe différents compilateurs pour une même plateforme. Ces différents compilateurs fonctionnent différemment et
ne donnent pas le même résultat. Certains sont plus exigeants que d'autres quand d'autres acceptent des syntaxes un peu plus
larges. Certains donnent plus d'indication sur les erreurs de compilation que d'autres.