0Pricing
C Academy · Lección

extern y linkage

Comparta símbolos entre archivos

extern y linkage es una lección gratuita de C Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.

¿Qué es el enlazado?

El enlazado describe si un nombre puede compartirse entre distintos archivos de código fuente.

Un nombre con enlazado externo hace referencia a la misma entidad en todo el programa. Un nombre con enlazado interno es privado de su propio archivo. Comprender el enlazado es fundamental para los programas distribuidos en varios archivos.

Compartir una variable

Suponga que dos archivos necesitan acceder a un contador global. No puede definirlo simplemente en ambos archivos; eso crea dos variables independientes y provoca un error de enlace por símbolos duplicados.

En su lugar, defínalo una sola vez y declárelo en todos los demás archivos con extern.

/* config.c */
int g_count = 0;   /* the one definition */

La palabra clave extern

extern indica al compilador que una variable existe en otra parte del programa, sin crear espacio de almacenamiento para ella aquí.

Es una declaración pura. Más adelante, el enlazador la resuelve asociándola con la única definición que se encuentra en otro archivo.

/* other.c */
extern int g_count;   /* declared, not defined */

void bump(void) {
    g_count++;
}

Declaración en el encabezado

El patrón correcto consiste en colocar la declaración extern en un encabezado y la definición correspondiente exactamente en un archivo de código fuente.

De este modo, cualquier archivo que incluya el encabezado puede utilizar la variable compartida.

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
extern int g_count;
#endif

Una definición, muchas declaraciones

Esta es la regla de una definición para las variables globales: una variable puede declararse con extern en muchos archivos, pero solo puede definirse en uno.

La única definición (sin extern) reserva el espacio de almacenamiento. Todas las declaraciones extern simplemente apuntan a ella.

/* config.h */ extern int g_count;  /* declaration */
/* config.c */ int g_count = 0;     /* definition  */

Las funciones también tienen vinculación externa

De forma predeterminada, las funciones también tienen vinculación externa; por eso un prototipo en un encabezado permite que otros archivos las llamen.

Puede escribir extern delante de un prototipo, pero es redundante: las funciones son externas a menos que indique lo contrario.

/* both forms mean the same */
int add(int a, int b);
extern int add(int a, int b);

Vinculación interna con static

La palabra clave static en el ámbito del archivo proporciona vinculación interna a un nombre: solo es visible dentro de su propio archivo de código fuente.

Utilícela para funciones auxiliares y variables globales que deban mantenerse privadas de un módulo. Los demás archivos no pueden verlas ni entrar en conflicto con ellas.

/* parser.c */
static int line_no = 0;   /* private to parser.c */

static void advance(void) {  /* private helper */
    line_no++;
}

extern frente a static

Estas dos palabras clave se encuentran en extremos opuestos de la vinculación.

extern solicita vinculación externa: comparte este nombre entre archivos. static en el ámbito del archivo fuerza la vinculación interna: mantiene este nombre privado. Elegir correctamente controla qué expone su módulo.

extern int shared_total;   /* visible everywhere */
static int local_cache;    /* only this file */

Un error común

A veces, los principiantes colocan una definición normal como int g_count; en un encabezado.

Como el encabezado se incluye en varios archivos, cada archivo obtiene su propia definición y el enlazador informa de un símbolo duplicado. Declare siempre con extern en el encabezado y defina una sola vez en un archivo .c.

/* WRONG in a header included twice */
int g_count;          /* multiple definition */
/* RIGHT */
extern int g_count;   /* declaration only */

Integración

Esta estructura de tres archivos es la forma estándar de compartir un estado.

El encabezado declara, un archivo de código fuente define y los demás lo utilizan después de incluir el encabezado. El enlazador conecta todas las referencias con la única definición.

/* config.h */ extern int g_count;
/* config.c */ #include "config.h"
               int g_count = 0;
/* main.c   */ #include "config.h"
               /* uses g_count */

Nota sobre la inicialización

Solo la definición real debe proporcionar un valor inicial: int g_count = 0;.

Una declaración extern no debe inicializarse, ya que no reserva espacio de almacenamiento. Escribir extern int g_count = 0; la convierte en una definición y anula el propósito de usarla.

extern int g_count;       /* ok: declaration */
extern int g_count = 0;   /* becomes a definition */

Comprobación rápida

Compruebe su comprensión de extern y la vinculación.

Resumen

Ha aprendido que la vinculación controla la visibilidad entre archivos. extern declara un nombre definido en otro lugar; static en el ámbito del archivo mantiene privado un nombre.

Comparta las variables globales con una definición y varias declaraciones extern. A continuación, compilará y enlazará estos archivos para crear un programa.

Preguntas frecuentes

¿La lección «extern y linkage» es gratis?

Sí — el texto completo de «extern y linkage» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.

¿Qué aprenderé en «extern y linkage»?

Comparta símbolos entre archivos Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C Academy?

No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «extern y linkage»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C Academy?

Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Archivos de cabecera y de código fuente
  2. Guardas de inclusión
  3. extern y linkage
  4. Compilar varios archivos
← Volver a C Academy