C Forever

C : Interna

static

Das Prefix "static" gibt es für Variablen und Funktionen gleichermaßen, und kann in zwei Zusammenhängen verwendet werden.

Global

Im globalen Zusammenhang, also auf Modulebene, schränkt es den Gültigkeitsbereich der so markierten Variable oder Funktion auf das Modul ein.
Das bedeutet : innerhalb des Moduls steht die Variable oder Funktion überall zur Verfügung, außerhalb des Moduls ist sie unbekannt. Daraus ergibt sich zudem, daß der Bezeichner außerhalb des Moduls beliebig anders verwendet werden darf, diese Verwendung ist dann innerhalb des Moduls, in dem der Bezeichner als "static" markiert ist, nicht bekannt.

In einen Block

Eine innerhalb eines Blocks als "static" markierte Variable ist nur innerhalb dieses Blocks bekannt. Sie verliert aber ihre Gültigkeit beim Verlassen des Blocks nicht.
Das bedeutet zum einen, der Speicherplatz wird nicht auf dem Stack reseviert. Zum anderen bleibt der beim Verlassen des Blocks in der Variable enthaltene Wert erhalten und steht beim erneuten Betreten des Blocks wieder zur Verfügung.

extern

Ist eine Variable oder Funktion "extern" deklariert, zeigt dies an, daß ihre Definition außerhalb des aktuellen Blocks oder Moduls liegt. Das wird hauptsächlich in Headerdateien verwendet, um solche Variablen oder Funktionen in anderen Modulen bekannt zu machen. Landet dadurch diese Deklaration im gleichen Modul wie die Definition, wird das "extern" ignoriert.

register

Die Deklaration einer Variable mit "register" soll darauf hinweisen, daß hier häufiger Gebrauch angenommen wird. Diese Deklaration ist als Vorschlag an den Compiler zu verstehen, für diese Variable ein Prozessorregister statt Stack zu verwenden, was dann zu einem schnelleren und kürzeren Programm führen würde.
Mit "register" dürfen nur automatische Variablen und Funktionsparameter versehen werden. Die Adresse einer solchen Variable ist nicht zugänglich, einen Zeiger darauf zu setzen führt zu einem Compilierfehler. "register" ist stark kontext- und maschinenabhängig, unpassende Verwendung ignoriert der Compiler einfach.

© Uwe Jantzen 13.12.23