Le concept de portée (ou scope en anglais) et de liaison (ou linkage en anglais) est essentiel pour comprendre le fonctionnement des fonctions en langage C. Ces deux concepts déterminent la visibilité et l’accessibilité des identificateurs (variables et fonctions) dans un programme.
Portée (Scope) :
La portée fait référence à la zone dans laquelle un identificateur (tel qu’une variable ou une fonction) est visible et peut être utilisé dans un programme. En langage C, il existe principalement trois niveaux de portée :

- Portée locale (Local Scope) :
- Les identificateurs déclarés à l’intérieur d’une fonction ont une portée locale.
- Ils ne sont accessibles qu’à l’intérieur de la fonction dans laquelle ils sont définis.
- Ces identificateurs sont généralement appelés variables locales.
- Portée globale (Global Scope) :
- Les identificateurs déclarés en dehors de toutes les fonctions ont une portée globale.
- Ils sont visibles depuis leur déclaration jusqu’à la fin du fichier source dans lequel ils sont définis.
- Ces identificateurs sont généralement appelés variables globales.
- Portée de bloc (Block Scope) :
- Les identificateurs déclarés à l’intérieur d’un bloc (généralement délimité par des accolades) ont une portée de bloc.
- Ils ne sont accessibles que dans ce bloc spécifique.
- Cette portée est souvent utilisée pour des variables temporaires dans des structures de contrôle telles que les boucles et les instructions conditionnelles.
Liaison (Linkage) :
La liaison fait référence à la manière dont les identificateurs sont associés à des emplacements de mémoire et comment ils sont référencés dans un programme. En langage C, il existe principalement deux types de liaison :
-
Liaison interne (Internal Linkage) :
- Les identificateurs avec une liaison interne sont limités à un seul fichier source.
- Ils sont déclarés avec le mot-clé
static
. - Ces identificateurs sont généralement des variables ou des fonctions utilisées uniquement dans le fichier où elles sont définies.
-
Liaison externe (External Linkage) :
- Les identificateurs avec une liaison externe sont visibles à travers plusieurs fichiers source.
- Ils sont déclarés en dehors de toutes les fonctions sans utiliser le mot-clé
static
. - Ces identificateurs sont souvent utilisés pour partager des variables ou des fonctions entre plusieurs fichiers source.
Exemple :
c#include
// Variable globale avec liaison externe
int globalVar = 10;
// Fonction avec liaison externe
void externalFunction() {
printf("This is an external function.\n");
}
int main() {
// Variable locale avec portée locale
int localVar = 20;
// Affichage des variables globale et locale
printf("Global variable: %d\n", globalVar);
printf("Local variable: %d\n", localVar);
// Appel de la fonction externe
externalFunction();
return 0;
}
Dans cet exemple :
globalVar
a une portée globale et une liaison externe, ce qui signifie qu’elle est accessible depuis n’importe où dans le fichier source et potentiellement dans d’autres fichiers.localVar
a une portée locale et n’est accessible que dans la fonctionmain()
.- La fonction
externalFunction()
a une liaison externe et peut être appelée de n’importe où dans le fichier source ou même dans d’autres fichiers. - Les identificateurs déclarés à l’intérieur de la fonction
main()
ont une portée locale et ne sont accessibles que dans cette fonction.
En comprenant ces concepts de portée et de liaison, les programmeurs peuvent organiser efficacement leurs identificateurs et contrôler leur visibilité dans leurs programmes en langage C.
Plus de connaissances
Bien sûr, approfondissons davantage ces concepts en explorant des situations plus complexes et en discutant de certaines subtilités associées à la portée et à la liaison en langage C.
Portée (Scope) :
Portée de Bloc (Block Scope) :
Dans le langage C, la portée de bloc permet la déclaration de variables à l’intérieur de blocs de code délimités par des accolades. Ces variables sont uniquement accessibles à l’intérieur de ces blocs et sont détruites à la sortie du bloc. Cela favorise l’encapsulation et la gestion efficace des ressources. Par exemple :
c#include
int main() {
// Variable avec portée de bloc
{
int x = 10;
printf("x inside block: %d\n", x);
}
// printf("%d\n", x); // Cela générerait une erreur car x est en dehors de sa portée
return 0;
}
Ici, la variable x
est déclarée à l’intérieur d’un bloc et n’est donc accessible que dans ce bloc.
Portée des Étiquettes (Label Scope) :
En langage C, les étiquettes sont utilisées avec les instructions de saut comme goto
. La portée des étiquettes s’étend jusqu’à la fin de la fonction ou jusqu’à la prochaine étiquette portant le même nom. Cela permet de sauter à des endroits spécifiques du code, mais leur utilisation est généralement découragée car elle peut compliquer la compréhension du code et entraîner des structures de contrôle peu claires.
Liaison (Linkage) :
Liaison Interne (Internal Linkage) :
Les identificateurs avec une liaison interne sont limités à un seul fichier source. Ils sont généralement déclarés à l’aide du mot-clé static
. Cette technique est couramment utilisée pour les fonctions et les variables qui ne doivent pas être visibles en dehors du fichier source dans lequel elles sont définies.
c// Fichier source 1 : file1.c
static int internalVar; // variable avec liaison interne
// Fichier source 2 : file2.c
// extern int internalVar; // Impossible d'accéder à internalVar d'un autre fichier
Liaison Externe (External Linkage) :
Les identificateurs avec une liaison externe sont visibles à travers plusieurs fichiers source. Ils sont généralement déclarés en dehors de toutes les fonctions sans utiliser le mot-clé static
. Les variables globales et les fonctions sont des exemples courants d’identificateurs avec une liaison externe.
c// Fichier source 1 : file1.c
int globalVar; // variable avec liaison externe
// Fichier source 2 : file2.c
// extern int globalVar; // Accès à globalVar d'un autre fichier
Déclaration et Définition :
La déclaration informe au compilateur l’existence d’un identificateur avant son utilisation, tandis que la définition alloue de l’espace de stockage pour cet identificateur. En général, les déclarations sont placées dans les en-têtes de fichiers (.h) et les définitions dans les fichiers sources (.c), mais il est important de noter que les déclarations peuvent également être des définitions si elles incluent une allocation de mémoire.
c// Déclaration
extern int globalVar; // Déclaration d'une variable globale définie dans un autre fichier
// Définition
int globalVar = 10; // Définition d'une variable globale
En comprenant ces nuances de portée et de liaison en langage C, les programmeurs peuvent écrire des programmes plus modulaires et mieux structurés, facilitant ainsi la maintenance et la collaboration sur des projets de grande envergure.