Vous avez écrit des fonctions qui fonctionnent. Le générateur rand et l’algorithme bubble_sort sont solides. Maintenant, vous en avez besoin ailleurs. Le copier-coller de code est compliqué. Cela crée des bugs. Cela fait de la maintenance un cauchemar.
La solution est une bibliothèque d’utilitaires.
En C, une bibliothèque n’est pas une boîte magique. Il s’agit de deux fichiers spécifiques travaillant ensemble : un en-tête (.h ) et une source (.c ). L’en-tête indique au compilateur ce qui est disponible. Le fichier source contient la logique réelle.
Voici comment structurer une bibliothèque C de base pour garder votre code propre et modulaire.
Définir l’interface
Toute fonction publique nécessite une déclaration. Cela réside dans le fichier d’en-tête.
Créez un fichier nommé util.h.
Ces lignes sont des prototypes de fonctions. Le mot-clé extern est important. Il indique au compilateur : “Cette fonction existe, mais je ne sais pas encore où. Je la retrouverai plus tard lors de la liaison.”
Si vous utilisez un compilateur C très ancien, vous devrez peut-être supprimer les noms de paramètres de « bubble_sort ». Les normes modernes préfèrent les prototypes complets, mais le code existant les supprime souvent.
Implémentation de la logique
Passons maintenant au gros du travail. Créez util.c.
Notez l’inclusion. Vous utilisez des guillemets ("util.h" ) au lieu de crochets angulaires ( ). Les crochets angulaires sont réservés aux bibliothèques système trouvées dans les répertoires standards. Les guillemets indiquent au compilateur de rechercher dans le répertoire courant.
Il y a ici une fonction de sécurité subtile. La variable rand_seed est définie dans le fichier .c mais pas dans le fichier .h. Il s’agit d’informations cachées.
Les programmes qui incluent util.h connaissent rand(). Ils ne connaissent pas « rand_seed ». Ils ne peuvent pas modifier accidentellement la graine. Si vous souhaitez appliquer cela strictement, vous pouvez ajouter le mot-clé « static » avant « int rand_seed ». Cela rend la variable visible uniquement dans ce fichier unique.
Utiliser la bibliothèque
Votre programme principal n’a pas besoin d’être implémenté. Il n’a besoin que de l’interface.
Créez main.c.
Le bénéfice est immédiat. La logique principale est plus courte. Vous n’encombrez pas votre code principal avec des algorithmes de tri ou des générateurs de nombres aléatoires. Vous venez de les appeler.
Compilation et liaison
C’est là que trébuchent la plupart des débutants. Vous ne pouvez pas tout compiler en même temps si vous souhaitez des fichiers objets séparés. Vous devez compiler séparément, puis créer un lien.
En supposant que vous utilisez un système de type UNIX, voici le flux de travail.
Tout d’abord, compilez la source de la bibliothèque dans un fichier objet.
L’indicateur -c indique à GCC de compiler mais pas de lier. Il s’arrête après la création du code machine. L’indicateur -g ajoute des symboles de débogage, ce qui est utile si les choses tournent mal. Le résultat est util.o. Ce fichier contient le code machine compilé pour rand et bubble_sort. Il ne peut pas fonctionner seul car il lui manque une fonction « principale ».
Ensuite, compilez votre programme principal.
Cela produit main.o. Encore une fois, ce n’est qu’un code machine. Ce n’est pas encore un exécutable.
Enfin, reliez-les ensemble.
Cette commande prend main.o et util.o et les assemble en un seul exécutable nommé main.
Exécutez-le avec :
Vous verrez une liste de dix nombres aléatoires, suivie d’un tiret séparateur, suivie de la liste triée.
Pourquoi c’est important
Vous pourriez vous demander : pourquoi s’embêter avec cette étape supplémentaire ? Pourquoi ne pas simplement coller les fonctions dans « main.c » ?
Parce que les bibliothèques évoluent. Au fur et à mesure que vos projets se développent, vous disposerez de dizaines de fonctions utilitaires. Les conserver dans des fichiers séparés vous permet de les réutiliser dans différents projets



















