Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

Speicherklassen in C verstehen: auto, extern, static, register erklärt

Was ist eine Speicherklasse in C?

Es gibt vier Standard-Speicherklassen:

  • auto – Standard für lokale Variablen.
  • extern – Deklariert eine globale Variable oder Funktion, die in einer anderen Datei existiert.
  • static – Bewahrt den Wert einer Variable zwischen Aufrufen und begrenzt Sichtbarkeit auf Datei oder Funktion.
  • register – Hinweis an den Compiler, Variable in einem CPU-Register für schnelleren Zugriff zu speichern.

Auto Speicherklasse

Mit auto deklarierte Variablen (Standard für lokale Variablen) existieren nur innerhalb des Blocks, in dem sie definiert sind. Sie werden zerstört, wenn der Block verlassen wird, und werden mit einem unbestimmten Wert initialisiert, sofern nicht explizit gesetzt.

int add(void) {
    int a = 13;
    auto int b = 48; // auto ist optional
    return a + b;
}

Gültigkeitsbereich-Demonstration:

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

Ausgabe: 3 2 1

Extern Speicherklasse

Das extern-Schlüsselwort deklariert eine Variable oder Funktion, die in einer anderen Translationseinheit definiert ist. Es ermöglicht Datenaustausch über Quelldateien hinweg.

/* main.c */
#include <stdio.h>
extern int i; // Deklaration
int main(void) {
    printf("value of the external integer is = %d\n", i);
    return 0;
}

/* original.c */
#include <stdio.h>
int i = 48; // Definition

Beide Dateien zusammen kompilieren: gcc main.c original.c -o program. Ausführung von ./program ergibt:

value of the external integer is = 48

Static Speicherklasse

Static-Variablen behalten ihren Wert für die Dauer des Programms. Sie können als lokale Statics oder Datei-Gültigkeitsbereich-Statics verwendet werden.

  • Lokal static – nur innerhalb der Funktion sichtbar, aber über Aufrufe hinweg persistent.
  • Datei-Gültigkeitsbereich static – nur innerhalb der Datei sichtbar, in der deklariert.
/* global static */
static int counter = 7;
void next(void) {
    /* lokal static */
    static int iteration = 13;
    iteration++;
    printf("iteration=%d and counter=%d\n", iteration, counter);
}
int main(void) {
    while (counter < 10) {
        next();
        counter++;
    }
    return 0;
}

Ausgabe:

iteration=14 and counter=7
iteration=15 and counter=8
iteration=16 and counter=9

Register Speicherklasse

Verwenden Sie register, wenn eine Variable häufig zugegriffen werden muss und in ein CPU-Register passt. Der Compiler kann den Hinweis ignorieren, wenn Register knapp sind.

#include <stdio.h>
int main(void) {
    register int weight;
    /* Adresse nehmen schlägt fehl */
    // int *ptr = &weight; // Kompilierfehler
    return 0;
}

Kompilierung ergibt:

error: address of register variable 'weight' requested

Zusammenfassungstabelle

SpeicherklasseDeklarationskontextSpeicherortStandardwertGültigkeitsbereichLebensdauer
autoinnerhalb Funktion/BlockSpeicherUnbestimmtFunktion/BlockFunktion/Block
registerinnerhalb Funktion/BlockCPU-RegisterUnbestimmtFunktion/BlockFunktion/Block
externaußerhalb aller FunktionenSpeicherNullGesamtes ProgrammProgrammlaufzeit
static (lokal)innerhalb Funktion/BlockSpeicherNullFunktion/BlockProgrammlaufzeit
static (global)außerhalb aller FunktionenSpeicherNullDateiProgrammlaufzeit

Wichtigste Erkenntnisse

  • Speicherklassen steuern Sichtbarkeit und Lebensdauer von Variablen.
  • Verwenden Sie auto für Standard-Lokalvariablen.
  • Verwenden Sie register für performance-kritische Zähler (abhängig von Compiler-Unterstützung).
  • Verwenden Sie static, um Zustand über Funktionsaufrufe zu bewahren oder Datei-Gültigkeitsbereich zu begrenzen.
  • Verwenden Sie extern, um Variablen oder Funktionen zwischen Quelldateien zu teilen.

C Sprache

  1. C# Klassen & Objekte: Fundamente für robustes OOP
  2. C# Static Keyword: Statische Variablen, Methoden und Klassen meistern
  3. C# Geschachtelte Klassen verstehen: Definition, Verwendung und Vererbung
  4. C++ Klassen & Objekte: Praktischer Leitfaden zur objektorientierten Programmierung
  5. C++ Friend-Funktionen und Friend-Klassen: Zugriffskontrolle meistern
  6. C++ Klassentemplates meistern: Ein praktischer Leitfaden
  7. C Speicherklassen verstehen: Gültigkeitsbereich, Lebensdauer und Performance
  8. C-Speicherklassen verstehen: Gültigkeitsbereich, Lebensdauer & Verwendung
  9. C++ Speicherklassen: Scope, Lifetime & Verwendung
  10. C++ Interfaces: Abstrakte Klassen & Pure Virtual Functions