Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 publique distance_squared qui prend quatre entiers (x1, y1, x2, y2) représentant deux points et retourne un entier. Incluez des gardes d'inclusion utilisant le symbole DISTANCE_H.
  • distance.c : Votre fichier source contenant l'implémentation. Créez une fonction utilitaire static appelée square qui prend un entier et retourne son carré. Cet utilitaire ne doit être visible qu'à l'intérieur de distance.c. Implémentez ensuite distance_squared en 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'utilitaire square ne doit pas être accessible ici—seule distance_squared est 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: 25

Aide-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;
}
quiz iconTestez-vous

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