Académique Documents
Professionnel Documents
Culture Documents
modulaire
1. Rappel ............................................................................................................................................................. 3
3. La compilation ................................................................................................................................................ 7
3.1. Le préprocesseur .......................................................................................................................................................................... 7
3.2. La compilation ............................................................................................................................................................................. 7
3.3. Édition de liens ............................................................................................................................................................................ 7
La programmation
modulaire I
1. Rappel
Rappel : Le prototype d'une fonction
Le prototype d'une fonction indique :
- son nom ;
- le nombre de paramètres d'entrée et le type de chacun d'entre eux ;
- le type de résultat en sortie.
Les noms de paramètre sont optionnels, mais il est fortement conseillé de les laisser. Cela donne une bonne
indication sur leurs rôles.
Exemples :
void function_1(int x) ;
int function_2(void) ;
3
2. Les headers
2.1. Les headers
Jusqu'ici, nous n'avions qu'un seul fichier source dans notre projet. Ce fichier source est « main.c ».
Nos programmes peuvent être tous écrits dans ce même fichier « main.c », mais ce n'est jamais très pratique
d'avoir un fichier de 1000 lignes. C'est pour cela qu'en général on crée plusieurs fichiers par projet.
Un projet, c'est l'ensemble des fichiers source de votre programme. Pour le moment, nos projets n'étaient
composés que d'un fichier source. Regardez dans votre IDE, généralement c'est sur la gauche.
Exemple
Ce projet n'est composé que d'un fichier « main.c ».
Exemple
Un vrai projet ressemblera à ça : on verra plusieurs fichiers dans la colonne de gauche.
Remarque
Ce n'est pas une obligation qu'on ne met que la fonction main dans « main.c ». Chacun s'organise comme il
veut.
4
En général, on regroupe dans un même fichier des fonctions ayant le même thème. Ainsi, :
- dans le fichier « fonctions_saisies.c », on a regroupé toutes les fonctions concernant les opérations de
saisie ;
- dans le fichier « fonctions_calculs.c », on a regroupé toutes les fonctions concernant les calculs ;
- dans le fichier « fonctions_affichages.c , on a regroupé toutes les fonctions concernant les opérations
d'affichage ;
2.1.2. Fichiers .h et .c
- Les « .h » : appelés fichiers headers. Ces fichiers contiennent les prototypes des fonctions.
- Les « .c » : les fichiers source. Ces fichiers contiennent les fonctions elles-mêmes.
Remarque
Pour chaque fichier « .c » ,il y a son équivalent « .h » qui contient les prototypes des fonctions.
Exemple
Quand on fait appel à une fonction,on doit déjà la connaître, savoir combien de paramètres elle prend, etc. On
doit inclure donc son prototype.
Pour cela, on doit inclure, dans le fichier « .c », les fichiers « .h » qui contiennent les prototypes des fonctions à
utiliser dans ce fichier « .c ».
Méthode
L'inclusion du fichier « .h » se fait grâce à la directive de préprocesseur #include.
5
Exemple
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include "fonctions_saisies.h"
4
5 int main()
6{
7 // ...
8}
Remarque
On utilise :
- les < > pour inclure les bibliothèques (des fichiers se trouvant dans le répertoire « include » de l'IDE) ;
- les " " pour inclure un fichier se trouvant dans le répertoire du projet (à côté des fichiers « .h » ,
généralement).
Les bibliothèques standard (par exemple « stdio.h » et « stdlib.h ») se trouvent dans le dossier d'installation de
l'IDE. Il faut généralement chercher un dossier include. Ce dernier contient de très nombreux fichiers. Ce sont
des headers (.h) des bibliothèques standard.
Exemple
C:\Program Files\CodeBlocks\MinGW\include
Remarque
Les fichiers « .c » qui contiennent le code source de ces fonctions sont déjà compilés (en code binaire, c'est-à-
dire en code machine). Il est donc totalement impossible de les lire.
On peut retrouver les fichiers compilés dans un répertoire appelé lib (c'est l'abréviation de library qui signifie «
bibliothèque »).
Exemple
C:\Program Files\CodeBlocks\MinGW\lib
6
3. La compilation
3.1. Le préprocesseur
Le préprocesseur est un programme qui démarre avant la compilation. Son rôle est d'exécuter les instructions
spéciales qu'on lui a données dans des directives de préprocesseur, ces lignes qui commencent par un #.
Il met à l'intérieur de chaque fichier « .c » le contenu des fichiers « .h » qu'on a demandé d'inclure. Le fichier «
.c » devient donc complet et contient tous les prototypes des fonctions qu'on utilise.
3.2. La compilation
Cette étape consiste à transformer les fichiers source en code binaire compréhensible par l'ordinateur. Le
compilateur compile les fichiers « .c » un à un. Il compile tous les fichiers source du projet.
Le compilateur génère un fichier « .o » (ou « .obj », ça dépend du compilateur) par fichier « .c » compilé.
7
4. La portée des fonctions et variables
La notion de portée des fonctions et des variables consiste à déterminer quand les variables et les fonctions sont
accessibles, c'est-à-dire quand on peut faire appel à elles.
Exemple
Dans le main, on essaie d'accéder à la variable resultat. Or, comme cette variable resultat a été créée dans la
fonction triple, elle n'est pas accessible dans la fonction main.
8
4.2. Les variables globales
4.2.1. Variable globale accessible uniquement dans un fichier
Une variable globale est accessible par toutes les fonctions écrites en‐dessous de sa définition dans le même
fichier source.
Exemple
1 #include <stdio.h>
2
3 int resultat = 0; // Déclaration de variable globale
4
5 void triple(int nombre)
6{
7 ...
8}
9
10 int main()
11 {
12 ...
13 return 0;
14 }
15
La variable resultat sera accessible dans TOUTES les fonctions de ce fichier (triple, main).
Une variable globale est accessible par toutes les fonctions écrites en‐dessous de sa définition dans le même
fichier source. Mais une fonction écrite dans un autre fichier ne peut pas se servir de cette variable globale.
Pour résoudre ce problème, le langage C prévoit une déclaration qui précise que la variable globale est définie
dans un autre fichier. C'est la déclaration extern.
Syntaxe
extern type nom_var ;
Cette déclaration indique au compilateur qu'il ne s'agit pas d'une nouvelle variable et qu'il ne doit pas réserver
de place en mémoire. La déclaration extern fournit le type de la variable et précise qu'elle est déjà définie
ailleurs.
Exemple
1 #include <stdio.h>
2
3 int glob=20;
4
5 int main()
6{
7 ...
8 return 0;
9}
9
10
1 #include <stdio.h>
2
3 void fonctionExemple()
4{
5 extern int glob;
6 printf("glob = %d\n",glob);
7}
8
Il est possible de rendre une variable globale accessible uniquement dans le fichier dans lequel elle se trouve.
Pour créer une variable globale accessible uniquement dans un fichier, on ajoute simplement le mot-clé static
devant.
Exemple
Remarque
L'utilisation conjointe des deux mots clés extern et static est donc impossible.
Exemple : Exemple 1
Lorsqu'on appelle la fonction triple plus tard, la variable resultat contiendra toujours la valeur de la dernière
fois.
Exemple : Exemple 2
1 int incremente()
2{
3 static int nombre = 0;
4
5 nombre++;
6 return nombre;
7}
8
10
9 int main()
10 {
11 printf("%d\n", incremente());
12 printf("%d\n", incremente());
13 printf("%d\n", incremente());
14 printf("%d\n", incremente());
15
16 return 0;
17 }
- La première fois qu'on appelle la fonction incremente, la variable nombre est créée et initialisée à 0. Elle
est incrémentée à 1, et une fois la fonction terminée la variable n'est pas supprimée.
- Lorsque la fonction est appelée une seconde fois, la ligne de la déclaration de variable est tout simplement
« sautée ». On ne recrée pas la variable, on réutilise la variable qu'on avait déjà créée (1). Elle est donc
incrémentée à 2.
- Lorsque la fonction est appelée une troisième fois, la variable nombre devient 3.
- Lorsque la fonction est appelée une quatrième fois, la variable nombre devient 4.
Si on veut créer des fonctions qui ne seront accessibles que dans le fichier dans lequel se trouve la fonction, on
ajoute le mot-clé static devant la fonction (dans la définition et le prototype).
Exemple
La fonction static triple ne peut être appelée que depuis une autre fonction du même fichier. Si on essaie
d'appeler la fonction triple depuis une fonction d'un autre fichier, ça ne marchera pas car triple n'y sera pas
accessible.
11