La palabra clave extern en C

Jinku Hu 12 octubre 2023
La palabra clave extern en C

Este artículo mostrará múltiples métodos sobre cómo usar la palabra clave extern en C.

Usar la palabra clave extern para declarar una variable definida en otros archivos en C

Generalmente, las variables del lenguaje C tienen 3 tipos diferentes de vinculación: vinculación externa, vinculación interna o sin vinculación. Si una variable está definida en el ámbito de un bloque o de una función, se considera que no tiene vinculación. Una variable que tiene el ámbito del archivo puede tener vinculación interna o externa. Es decir, si una variable global se declara con el calificador static, tiene la vinculación interna, lo que implica que la variable puede ser utilizada en un solo archivo fuente (unidad de traducción para ser más precisos). Una variable global sin el calificador static se considera que tiene vinculación externa y puede utilizarse en diferentes archivos fuente. Para utilizar la variable global definida en algún otro fichero fuente, debe declararse utilizando la palabra clave 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);
}

Producción :

counter: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Las variables cualificadas extern suelen estar definidas en algún archivo diferente. Aún así, técnicamente se pueden declarar variables globales en el mismo fichero con la palabra clave extern, como se muestra en el siguiente ejemplo. Este tipo de declaración es esencialmente redundante porque el compilador automáticamente hace que los nombres de las variables sean visibles en cualquier parte del ámbito del mismo archivo.

#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);
}

Sin embargo, las variables declaradas con la palabra extern no deben ser inicializadas, ya que esto conduce a advertencias del compilador si definimos la variable global const char* en un archivo fuente y la inicializamos con algún valor literal de cadena. Declarar la misma variable sin el calificador const en un archivo fuente diferente compilará sin advertencias, y eliminará la constancia del objeto. Por lo tanto, si el usuario trata de modificar la cadena de sólo lectura tmp, el compilador no lanzará un error, pero el programa llegará a la falla de segmentación.

#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);
}
Autor: 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