Fonctions statiques
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 4 sur 61.
Lorsque vous répartissez le code entre plusieurs fichiers, chaque fonction définie dans un fichier source est visible par défaut par les autres fichiers. Mais vous avez parfois besoin de fonctions auxiliaires qui ne doivent être utilisées qu’en interne : des fonctions auxquelles les autres fichiers ne devraient pas accéder, ni même savoir qu’elles existent.
Le mot-clé static, lorsqu’il est appliqué à une fonction, limite sa visibilité au fichier dans lequel elle est définie. Cela crée une fonction privée qui ne peut pas être appelée depuis d’autres fichiers source, même si quelqu’un essaie de la déclarer.
// math_utils.c
#include "math_utils.h"
// Helper privé - 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 que dans math_utils.c. Si main.c essaie d’appeler directement square(), 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 C实现 l’encapsulation au niveau du fichier. Les fonctions statiques vous permettent de masquer les détails d’implémentation, en gardant votre interface publique claire tout en utilisant toute la logique auxiliaire dont vous avez besoin en interne.
Défi
FacileConstruisons un calculateur de distance qui utilise une fonction auxiliaire privée pour calculer le carré d’un nombre : un détail qui doit rester caché au 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 renvoie un entier. Des protections contre les inclusions multiples utilisant le symboleDISTANCE_H.distance.c: votre fichier source contenant l’implémentation. Créez une fonction auxiliairestaticappeléesquarequi prend un entier et renvoie son carré. Cette fonction auxiliaire ne doit être visible qu’à l’intérieur dedistance.c. Implémentez ensuitedistance_squareden utilisant votre fonction auxiliaire statique pour calculer (x2-x1)² + (y2-y1)².main.c: votre fichier principal qui inclut l’en-tête et utilise la fonction publique. La fonction auxiliairesquarene doit pas être accessible ici : seuledistance_squaredest disponible.
La fonction distance_squared calcule la distance euclidienne au carré entre deux points. En gardant la fonction square statique, vous masquez ce détail d’implémentation pour tout code situé en dehors de distance.c.
Vous recevrez quatre entrées entières : x1, y1, x2 et y2.
Affichez la distance au carré dans ce format :
Squared distance: {result}Par exemple, avec les points (0, 0) et (3, 4), la sortie serait :
Squared distance: 25Essayez 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
// and print the result in the 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 Programmation Orientée Objet
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 cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne