# Introduction au langage C/Premier programme
## Introduction

Ce chapitre vous permettra d'obtenir toutes les informations nécessaires et détaillées pour construire un programme simple.
Les programmes que nous allons faire seront pour la plupart des programmes à affichage dans le mode console.

## Le programme

Coller le code ci-dessous dans un fichier nommé hello.c.
Sous Windows ou Unix, lancer la commande de compilation :
Ensuite il suffit d'exécuter le fichier créé par cette opération (hello).

## Explications
### Commentaires

Un commentaire en C peut s'écrire de deux manières :
* de façon classique en C, qui commence avec /* et finit avec */ :
* depuis C99, comme en C++ pour une seule ligne :
Conseils de codage à respecter : c_lis_1, c_lis_2, c_mod_2.

### Include

Lors d'un processus appelé "précompilation", un petit programme que l’on appelle préprocesseur ajoute, supprime et remplace des parties de votre source. Il traite les lignes commençant par le signe #. Cette précompilation fait partie de la chaine de compilation mais ce processus n’est pas lié directement à la compilation elle-même : le préprocesseur ne connait pas le langage C. C'est un programme qui manipule du texte.
L'option -E du compilateur gcc permet de voir à l'écran le résultat de cette phase.
Le code #include <stdio.h> demande au préprocesseur d'inclure le fichier stdio.h, qui contient le prototype (la description) de la fonction puts, utilisée plus tard dans le programme. Ce fichier d'extension .h est situé le plus souvent dans le dossier /usr/include ou dans un fichier de l'arborescence liée au compilateur, que nous aborderons plus tard dans le cours.
Il y a plusieurs manières d’utiliser l'instruction #include.
* #include < nom_de_fichier > pour aller chercher un fichier dans les fichiers à inclure du compilateur.
* #include " nom_de_fichier " pour aller chercher un fichier créé par l'utilisateur dans le dossier du programme.
Le code machine de la fonction puts est fourni par une bibliothèque précompilée libC liée au programme lors de la phase d'édition de liens.
Conseil de codage à respecter : c_mod_9.

### Fonction principale main

Chaque programme possède une fonction main. La fonction main est obligatoire dans tout programme en C standard. C'est le point d'entrée du programme lors de son exécution.
Si l’on ne veut pas récupérer de paramètres de la ligne de commande qui a permis de lancer l'exécutable :
ou en souhaitant utiliser les paramètres :
L'argument argc donne le nombre d'arguments reçus augmenté de un. L'argument argv donne la liste des arguments passés à l'appel de notre programme. C'est un tableau de chaines de caractères avec argv[0] : le nom du programme, argv[n] : valeur du paramètre numéro n.
Conseil de codage à respecter : c_lis_10.

#### Fonctions

* Une fonction est une série d'instructions. Une fonction peut être appelée par une autre fonction et doit retourner une valeur sauf si elle est du type void.
* Elle peut prendre des arguments dont les noms et types sont définis entre les parenthèses. Si la fonction n'attend aucun paramètre, on l'indique par le mot réservé void entre parenthèses.
Conseils de codage à respecter : c_rec_10, c_rob_5.

#### Retour de valeurs

Le return EXIT_SUCCESS est là pour signifier au système d'exploitation que le logiciel a été exécuté sans erreur. EXIT_SUCCESS est une constante qui vaut 0, elle est définie dans stdlib.h.
On peut donc, si une erreur se produit, retourner au système une autre valeur que 0 par return x; où x est une variable qui contiendrait une valeur entière autre que 0. On peut ainsi associer une certaine valeur à un certain type d'erreur. Il est conseillé de n'avoir qu'un seul point de sortie par fonction.
Lorsque la fonction main aura terminé d'exécuter ses instructions, le programme se terminera.
Conseil de codage à respecter : c_exp_3.

### Utilisation de fonctions

La bibliothèque standard du langage C fournit les fonctions essentielles d'accès aux entrées et sorties du programme (accès aux fichiers et à l'affichage). Cela peut paraitre peu, mais un programme très complexe peut être entièrement construit à partir de ces fonctions.
Si une fonction retourne une valeur que l’on souhaite stocker dans une variable, la syntaxe suivante est utilisée pour son appel :
ou si on ne souhaite pas utiliser le code retour de la fonction :
Exemple de fonction bonjour qui n'accepte pas de paramètre et ne retourne pas de valeur :
Le code retour, les paramètres (nombre et types) d'une fonction doivent être conformes à ceux définis dans son prototype sous peine d'erreur ou d'avertissement lors de la compilation. Si le compilateur est ancien ou rendu laxiste, cela pourra conduire à une erreur difficile à trouver lors de l'exécution du programme.
Conseil de codage à respecter : c_rob_3.

## Génération d'un exécutable
### La chaine de compilation

Le but est d'obtenir un fichier exécutable que vous pourrez faire marcher sur votre ordinateur. La chaine de compilation permet de passer du code source d'un programme à un binaire exécutable.
On peut distinguer trois phases principales :
* Le prétraitement : Traitement par le préprocesseur des fichiers sources .c et .h., le résultat est du fichier texte lisible avec un éditeur.
* La compilation du ou des fichiers issus de l'étape précédente. Cette phase complexe produit des fichiers binaires d'extension .o dans lesquels le texte a été transformé en un langage compréhensible par la machine.
* L'édition de lien qui rassemble les fichiers précédents et d'autres bibliothèques pour produire un fichier exécutable.
Pour les programmes simples, il est possible de demander au compilateur C d'enchainer les trois phases précédentes et de produire simplement un exécutable compatible avec votre machine.

### Disposer d'un compilateur

Vous devez disposer d'un compilateur C.
La suite libre GCC de la Free Software Foundation va vous permettre de mettre en pratique ce cours.
Vous trouverez des conseils de mise en œuvre selon votre plateforme informatique sur le wiki Livre Exercices en langage C.

### Compiler le premier programme

* Créez un répertoire de travail.
* Copiez le code source du programme bonjour.c dans un éditeur de texte du genre textedit ou notepad, sauvegardez dans un fichier de nom bonjour.c dans le répertoire précédemment créé ( Celui même de l'étape n°1 ).
* Ouvrez une fenêtre de commande sur le répertoire précédent.
* Tapez la commande : gcc -o hello.exe hello.c
Cette commande demande au compilateur gcc :
* de compiler le fichier source hello.c
* de nommer le fichier exécutable produit : hello.exe, grâce à l'option -o.

### Exécuter le programme

Lancer la commande : hello.exe ou ./hello.exe
Vous devriez voir s'afficher :
Conseil de codage à respecter : c_rob_1.

## Pour aller plus loin
### Aide sur les commandes et fonctions C

Vous pouvez obtenir de l'aide :
* Sur l’internet;
* Pour les utilisateur UNIX, Linux et Mac à l'aide de la commande man. Exemple : man -s3 printf

### Projets plus importants

Vous pouvez :
* Répartir vos fonctions dans plusieurs fichiers.
* Automatiser la génération des exécutables à l'aide de l'outil make.
* Utiliser un environnement de développement intégré (IDE).

### Utilisation de bibliothèques

Une bibliothèque est un ensemble de fonctions définies par vous ou un autre programmeur, pour être appelées par votre programme. Cela permet la réutilisation briques logicielles qui allègeront vos programmes.
Elles peuvent être fournies sous forme de code source ou de fichiers binaires à lier à vos programmes (exemple d'extension rencontrées : .a .so .dll). Des fichiers ".h" qui contiennent les prototypes et constantes liées aux fonctions de la bibliothèque et seront inclus dans vos fichiers sources.

#### Bibliothèques de base du langage C

Voir le chapitre 10 sur les fonctions de base :
* stdio.h
* conio.h
* string.h
* stdlib.h
* ctype.h
* math.h

#### Bibliothèques Unix du langage C

* unistd.h

#### Bibliothèques graphiques

* GTK : Gimp ToolKit
* QT, en C++
* API Win32, pour la plateforme Windows de Microsoft
* SDL, Simple DirectMedia Layer

#### Bibliothèques 3d

* DirectX, pour la plateforme Windows de Microsoft
* OpenGL

#### Framework

Certains programmes fournissent même leurs propres bibliothèques pour ajouter des modules et/ou des fonctionnalités à leurs logiciels. On appelle cet ensemble de bibliothèques propres à un environnement de développement intégré (IDE) un Framework (plateforme de travail).