Fonctions statiques
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 4 sur 61.
Lorsque vous divisez le code en plusieurs fichiers, chaque fonction définie dans un fichier source est visible par les autres fichiers par défaut. Mais parfois, vous avez besoin de fonctions d'aide qui ne devraient être utilisées qu'en interne — des fonctions auxquelles les autres fichiers ne devraient pas accéder ou dont ils ne devraient même pas avoir connaissance.
Le mot-clé static, lorsqu'il est appliqué à une fonction, restreint sa visibilité au fichier où elle est définie. Cela crée une fonction privée qui ne peut pas être appelée depuis d'autres fichiers sources, même si quelqu'un tente de la déclarer.
// math_utils.c
#include "math_utils.h"
// Aide privée - uniquement visible dans ce fichier
static int square(int x) {
return x * x;
}
// Fonction publique - peut être appelée depuis main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Dans cet exemple, sum_of_squares est déclaré dans l'en-tête et peut être utilisé n'importe où. Cependant, square est marqué static, il n'existe donc qu'au sein de math_utils.c. Si main.c tente d'appeler square() directement, l'éditeur de liens produira une erreur — la fonction n'existe tout simplement pas en dehors de son fichier.
C'est la manière dont le langage C permet de réaliser l'encapsulation au niveau du fichier. Les fonctions statiques vous permettent de masquer les détails d'implémentation, gardant votre interface publique propre tout en utilisant la logique d'assistance dont vous avez besoin en interne.
Défi
FacileConstruisons un calculateur de distance qui utilise une fonction utilitaire privée pour calculer le carré d'un nombre—un détail qui doit rester caché du reste de votre programme.
Vous allez créer trois fichiers :
distance.h: Votre fichier d'en-tête déclarant une seule fonction publiquedistance_squaredqui prend quatre entiers (x1, y1, x2, y2) représentant deux points et retourne un entier. Incluez des gardes d'inclusion utilisant le symboleDISTANCE_H.distance.c: Votre fichier source contenant l'implémentation. Créez une fonction utilitairestaticappeléesquarequi prend un entier et retourne son carré. Cet utilitaire ne doit être visible qu'à l'intérieur dedistance.c. Implémentez ensuitedistance_squareden utilisant votre utilitaire statique pour calculer (x2-x1)² + (y2-y1)².main.c: Votre fichier principal qui inclut l'en-tête et utilise la fonction publique. L'utilitairesquarene doit pas être accessible ici—seuledistance_squaredest disponible.
La fonction distance_squared calcule le carré de la distance euclidienne entre deux points. En gardant la fonction square statique, vous cachez ce détail d'implémentation de tout code à l'extérieur de distance.c.
Vous recevrez quatre entrées entières : x1, y1, x2, et y2.
Affichez le carré de la distance dans ce format :
Squared distance: {result}Par exemple, avec les points (0, 0) et (3, 4), la sortie serait :
Squared distance: 25Aide-mémoire
Le mot-clé static limite la visibilité d'une fonction au fichier où elle est définie, créant ainsi une fonction privée qui ne peut pas être appelée depuis d'autres fichiers sources.
// Aide privée - uniquement visible dans ce fichier
static int square(int x) {
return x * x;
}
// Fonction publique - peut être appelée depuis d'autres fichiers
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Les fonctions statiques fournissent une encapsulation au niveau du fichier, vous permettant de masquer les détails d'implémentation tout en gardant votre interface publique propre.
Essayez vous-même
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: Appeler distance_squared avec les coordonnées d'entrée
// et afficher le résultat au format : "Squared distance: {result}"
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