Le mot-clé extern en C
Cet article présente plusieurs méthodes pour utiliser le mot-clé extern
en C.
Utiliser le mot-clé extern
pour déclarer une variable définie dans d’autres fichiers en C
En général, les variables du langage C ont 3 types de liens différents : lien externe, lien interne ou aucun lien. Si une variable est définie dans un bloc ou une fonction, elle est considérée comme n’ayant aucun lien. Une variable qui a la portée d’un fichier peut avoir un lien interne ou externe. En d’autres termes, si une variable globale est déclarée avec le qualificatif static
, elle a le lien interne, ce qui implique que la variable peut être utilisée dans un seul fichier source (unité de traduction pour être plus précis). Une variable globale sans le qualificatif static
est considérée comme ayant un lien externe et peut être utilisée dans différents fichiers sources. Pour utiliser la variable globale définie dans un autre fichier source, elle doit être déclarée à l’aide du mot-clé extern
.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
extern int counter;
int main(void) {
printf("counter: ");
for (int i = 0; i < COUNT; ++i) {
counter += 1;
printf("%d, ", counter);
}
printf("\b\b \n");
exit(EXIT_SUCCESS);
}
Production :
counter: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Les variables qualifiées externes
sont généralement définies quelque part dans différents fichiers. Cependant, techniquement, on peut déclarer des variables globales dans le même fichier avec le mot-clé extern
, comme le montre l’exemple suivant. Ce type de déclaration est essentiellement redondant car le compilateur rend automatiquement les noms de variables visibles n’importe où dans le même fichier.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
int counter2 = 0;
int main(void) {
extern int counter2; // redundant
counter2 += 10;
printf("%d\n", counter2);
exit(EXIT_SUCCESS);
}
Attention cependant, les variables déclarées extern
ne doivent pas être initialisées car cela entraîne des avertissements au compilateur si nous définissons une variable globale const char*
dans un fichier source et que nous l’initialisons avec une valeur littérale de chaîne de caractères. Déclarer la même variable sans le qualificatif const
dans les différents fichiers sources entraînera une compilation sans avertissement, et supprimera la constance de l’objet. Ainsi, si l’utilisateur tente de modifier la chaîne en lecture seule tmp
, le compilateur ne lancera pas d’erreur, mais le programme touchera l’erreur de segmentation.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
extern int counter;
// extern int counter = 3; // erroreous
extern char *tmp; // erroreous
int counter2 = 0;
int main(void) {
printf("counter: ");
for (int i = 0; i < COUNT; ++i) {
counter += 1;
printf("%d, ", counter);
}
printf("\b\b \n");
tmp[0] = 'S'; // segmentation fault
printf("%s", tmp);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook