Le mot-clé extern en C

Jinku Hu 12 octobre 2023
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);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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