La Portée




Intéressons-nous à la portée, mais alors la portée c'est quoi, je suppose que cette question vous brûle les lèvres, je me trompe ? En fait ça répond tout bêtement à la question suivante :


Quand est-ce qu'une variable ou fonction est accessible ?

Quand est-elle déclarée dans main.c ? Ou alors dans la fonction main ? Ou dans tous les fichiers du projet ?


Nous allons donc voir ensemble dans cette partie, la portée des variables et des fonctions !

Bon, on commence par quoi ?  bah les variables !


La portée des variables


Attention, la phrase qui suit est plus qu'importante, c'est la phrase clé de cette partie, une variable déclarée dans un bloc d'instructions est supprimée automatiquement à la fin de ce bloc ! Si vous avez compris ça, vous avez tout compris, si si je vous jure .

En d'autres termes, lorsque vous déclarez une variable entre deux accolades, elle est supprimée à l'accolade fermante, on appelle ces variables des variables locales.


Voyons ensemble quelques exemples...


J'ai déclaré dans ce code source plusieurs variables locales (donc dans différents blocs) :

// Aucune variable déclarée
int main()
{
    int a;
    // Une variable déclarée : a
    {
        int b;
        // Deux variables déclarées : a et b
        {
            int c;
            // Trois variables déclarées : a, b et c
        }
    // Deux variables déclarées : a et b
    }
    // Une variable déclarée : a
    int d;
    // Deux variables déclarées : a et d
    return 0;
}
// Aucune variable déclarée


Ce n'est pas très difficile à comprendre, une variable a une durée de vie, c'est tout ce que vous devez comprendre pour le moment.


Tenez, pour ceux qui n'auraient pas encore très bien compris, j'ai concocté un autre exemple :

int main()
{
    int i;

    for (i = 0; i < 10; i++)
    {
        int nombre = 52;
    }

    return 0;
}


Ce code source ne sert à rien du tout, autant vous prévenir tout de suite.


Comme le bloc est répétée 10 fois, la variable nombre est déclarée puis supprimée 10 fois. On ne déclare pas ici 2 fois la même variable puisqu'elle est supprimée juste après sa déclaration, et puis si vous compilez, vous verrez bien que le compilateur ne bronche pas.


Ca fait quoi si je déclare une variable dans aucun bloc ?


Qu'attendez-vous pour essayer ! N'oubliez pas qu'une fonction est un bloc d'instructions !


int variable = 10; // Déclaration d'une variable globale

int main()
{
    printf("%d", variable);

    return 0;
}


Ça marche ! Vous avez déclaré ce qu'on appelle en programmation une variable globale (à retenir, c'est le contraire de locale), elle est accessible partout dans tous les fichiers du projet !


Il faut éviter les variables globales, mais comme vous risquerez d'en rencontrer plus tard j'ai voulu vous en parler.


Il existe aussi les variables globales accessibles uniquement dans un fichier, elles sont plus rares mais peuvent s'avérer très utiles dans certains cas.


Pour en déclarer, rien de plus simple il suffit de déclarer une simple variable globale mais attention, il ne faut pas oublier d'ajouter le mot clé static comme ci-dessous :

static int variable = 10; // Déclaration d'une variable globale accessible uniquement dans main.c

int main()
{
    printf("%d", variable);

    return 0;
}


Méfiez-vous, si vous déclarez une variable statique (mot clé static) à l'intérieur d'une fonction. Cette dernière ne sera plus supprimée à la fin de la fonction, la prochaine fois qu'on appellera la fonction, la variable aura conservé sa valeur. Ça n'a donc pas le même sens que les simples variables globales statiques.


C'est tout pour la portée des variables, vous venez de découvrir l'existence des variables globales qui sont à éviter le plus possible.


La portée des fonctions


Passons aux fonctions, c'est un peu le même principe que les variables vous allez voir !


Lorsque vous créez une fonction, elle est généralement globale, donc accessible dans tous les fichiers du projet.


En effet, il est très rare (et très très très très déconseillé) d'implémenter une fonction dans une autre ! Je considérerai donc que les fonctions sont toujours globales.


Si vous voulez rendre une fonction globale accessible uniquement dans un fichier, il vous suffit d'utiliser le mot clé static comme tout à l'heure !


Traduction maintenant en image (suspense) :

static void salut() // Fonction accessible uniquement dans main.c
{
    printf("Salut !");
}

int main()
{
    salut();

    return 0;
}


C'est aussi simple que ça !


Je vous affiche le résultat pour vous prouver que je ne vous raconte pas de conneries depuis tout à l'heure .

Salut !


Rien d'autres à dire sur les fonctions, on peut facilement comparer une fonction à une variable, elle s'utilise à peu près de la même façon.

Créé avec HelpNDoc Personal Edition: Générateur de documentation et EPub gratuit