Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Entendiendo las clases de almacenamiento en C: auto, extern, static, register explicados

¿Qué es una clase de almacenamiento en C?

Una clase de almacenamiento define el alcance, ubicación, inicialización, vida y accesibilidad de una variable. En C, cada variable no solo tiene un tipo, sino que también se le asigna una clase de almacenamiento que determina dónde y cómo puede ser accedida.

Hay cuatro clases de almacenamiento estándar:

Clase de almacenamiento Auto

Las variables declaradas con auto (la predeterminada para variables locales) existen solo dentro del bloque donde se definen. Se destruyen cuando el bloque sale, y se inicializan con un valor indeterminado a menos que se establezcan explícitamente.

int sumar(void) { int a = 13; auto int b = 48; // auto es opcional return a + b; }

Demostración de alcance:

#include <stdio.h> int main(void) { auto int j = 1; { auto int j = 2; { auto int j = 3; printf("%d ", j); // imprime 3 } printf("\t%d ", j); // imprime 2 } printf("%d\n", j); // imprime 1 }

Salida: 3 2 1

Clase de almacenamiento Extern

La palabra clave extern declara una variable o función que está definida en otra unidad de traducción. Permite compartir datos entre archivos fuente.

/* main.c */ #include <stdio.h> extern int i; // declaración int main(void) { printf("valor del entero externo es = %d\n", i); return 0; } /* original.c */ #include <stdio.h> int i = 48; // definición 

Compila ambos archivos juntos: gcc main.c original.c -o programa. Ejecutando ./programa se obtiene:

valor del entero externo es = 48

Clase de almacenamiento Static

  • Static local – visible solo dentro de la función pero persiste entre llamadas.
  • Static de ámbito de archivo – visible solo dentro del archivo donde se declara.
/* static global */ static int contador = 7; void siguiente(void) { /* static local */ static int iteracion = 13; iteracion++; printf("iteracion=%d y contador=%d\n", iteracion, contador); } int main(void) { while (contador < 10) { siguiente(); contador++; } return 0; } 

Salida:

iteracion=14 y contador=7 iteracion=15 y contador=8 iteracion=16 y contador=9

Clase de almacenamiento Register

Usa register cuando una variable necesita ser accedida frecuentemente y puede caber en un registro de CPU. El compilador puede ignorar la sugerencia si los registros son escasos.

#include <stdio.h> int main(void) { register int peso; /* intentar tomar su dirección falla */ // int *ptr = &peso; // error de compilación return 0; }

Compilar el código produce:

error: address of register variable 'peso' requested

Tabla resumen

Clase de almacenamientoContexto de declaraciónUbicación de almacenamientoValor por defectoAlcanceVida
autodentro de una función/bloqueMemoriaImpredecibleFunción/bloqueFunción/bloque
registerdentro de una función/bloqueRegistro CPUImpredecibleFunción/bloqueFunción/bloque
externfuera de todas las funcionesMemoriaCeroTodo el programaTiempo de ejecución del programa
static (local)dentro de una función/bloqueMemoriaCeroFunción/bloqueTiempo de ejecución del programa
static (global)fuera de todas las funcionesMemoriaCeroArchivoTiempo de ejecución del programa

Conclusiones clave

  • Las clases de almacenamiento controlan la visibilidad y vida de las variables.
  • Usa auto para variables locales estándar.
  • Usa register para contadores críticos de rendimiento (sujeto a soporte del compilador).
  • Usa static para preservar estado entre llamadas a funciones o limitar ámbito de archivo.
  • Usa extern para compartir variables o funciones entre archivos fuente.

Lenguaje C

  1. Clases y objetos en C#: Fundamentos para POO robusta
  2. Palabra clave static en C#: Dominando variables, métodos y clases estáticas
  3. Entendiendo clases anidadas en C#: Definición, uso y herencia
  4. Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
  5. Funciones y clases amigas en C++: dominando el control de acceso
  6. Dominando las plantillas de clase en C++: guía práctica
  7. Entendiendo las clases de almacenamiento en C: ámbito, vida y rendimiento
  8. Entendiendo las clases de almacenamiento en C: Alcance, vida útil y uso
  9. Entendiendo las Clases de Almacenamiento en C++: Alcance, Vida y Uso
  10. Interfaces en C++: Dominando Clases Abstractas y Funciones Virtuales Puras
  11. Estructura de Programa C#: Componentes Principales y Ejemplo Hello World