Fichiers sources
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 3 sur 61.
Jusqu'à présent, nous avons placé les déclarations de fonctions dans des fichiers d'en-tête, mais le code réel de la fonction (la définition) se trouvait dans le fichier principal. La prochaine étape de la programmation modulaire consiste à déplacer ces définitions dans leurs propres fichiers sources (fichiers .c).
Cela crée une structure propre en trois parties : l'en-tête déclare les fonctions, un fichier source séparé les définit, et main les utilise simplement. Voici à quoi cela ressemble :
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
Remarquez que math_utils.c inclut son propre en-tête. Cela garantit que la définition de la fonction correspond à la déclaration — si elles ne correspondent pas, le compilateur détectera l'erreur. Le fichier principal a seulement besoin d'inclure l'en-tête pour utiliser la fonction ; il n'a pas besoin de savoir comment add fonctionne en interne.
Cette séparation permet de garder les détails d'implémentation cachés et vous permet de modifier la logique de la fonction sans toucher aux fichiers qui utilisent ces fonctions.
Défi
FacileConstruisons un utilitaire mathématique simple en organisant votre code selon la structure appropriée en trois fichiers : un en-tête pour les déclarations, un fichier source pour les implémentations et un fichier principal qui les utilise.
Vous allez créer trois fichiers :
math_ops.h: Votre fichier d'en-tête contenant les déclarations de fonctions pour deux opérations :multiplyetsubtract. Les deux fonctions prennent deux entiers et renvoient un entier. N'oubliez pas d'inclure des gardes en utilisant le symboleMATH_OPS_H.math_ops.c: Votre fichier source contenant les implémentations réelles demultiplyetsubtract. Ce fichier doit inclure son propre en-tête pour s'assurer que les déclarations correspondent aux définitions.main.c: Votre fichier principal qui inclut l'en-tête et utilise les deux fonctions pour effectuer des calculs.
La fonction multiply doit renvoyer le produit de deux entiers, et subtract doit renvoyer le premier entier moins le second.
Vous recevrez deux entrées entières : a et b.
Dans votre fonction principale, affichez les résultats des deux opérations sur des lignes séparées :
Product: {result of multiply}
Difference: {result of subtract}Par exemple, avec les entrées 8 et 3, la sortie serait :
Product: 24
Difference: 5Aide-mémoire
Les définitions de fonctions peuvent être déplacées du fichier principal vers des fichiers sources séparés (fichiers .c), créant ainsi une structure modulaire en trois parties :
- Fichier d'en-tête (
.h) : Contient les déclarations de fonctions - Fichier source (
.c) : Contient les définitions de fonctions - Fichier principal (
main.c) : Utilise les fonctions
Exemple de structure :
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
Le fichier source (.c) doit inclure son propre en-tête pour s'assurer que la définition de la fonction correspond à la déclaration. Le fichier principal a seulement besoin d'inclure l'en-tête pour utiliser les fonctions, gardant ainsi les détails d'implémentation cachés.
Essayez vous-même
#include <stdio.h>
#include "math_ops.h"
int main() {
int a, b;
scanf("%d", &a);
scanf("%d", &b);
// TODO: Appeler la fonction de multiplication avec a et b, stocker le résultat
// TODO: Appeler la fonction de soustraction avec a et b, stocker le résultat
// TODO: Afficher les résultats au format :
// Product: {résultat de la multiplication}
// Difference: {résultat de la soustraction}
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle