" Was ist ein " static
"Funktion in C? "
Fangen wir ganz am Anfang an.
Das Ganze basiert auf einer sogenannten "Verknüpfung":
" Ein Bezeichner, der in verschiedenen Bereichen oder mehr als einmal im selben Bereich deklariert ist, kann durch einen Prozess, der als Verknüpfung bezeichnet wird, dazu gebracht werden, auf dasselbe Objekt oder dieselbe Funktion zu verweisen. 29) Es gibt drei Arten von Verknüpfungen: externe, interne und keine. "
Quelle: C18, 6.2.2/1
"In der Menge der Übersetzungseinheiten und Bibliotheken, die ein ganzes Programm ausmachen, wird jede Deklaration eines bestimmten Bezeichners mit Außenanbindung bezeichnet das gleiche Objekt oder die gleiche Funktion. Innerhalb einer Übersetzungseinheit wird jede Deklaration eines Bezeichners mit interne Verknüpfung bezeichnet das gleiche Objekt oder die gleiche Funktion. Jede Deklaration eines Identifikators ohne Verknüpfung bezeichnet eine eindeutige Entität".
Quelle: C18, 6.2.2/2
Wird eine Funktion ohne Angabe einer Speicherklasse definiert, hat die Funktion extern
al-Verknüpfung standardmäßig:
"Wenn die Deklaration eines Bezeichners für eine Funktion keinen Speicherklassenspezifizierer hat, wird seine Verknüpfung genau so bestimmt, als ob er mit dem Speicherklassenspezifizierer deklariert wäre extern ."
Quelle: C18, 6.2.2/5
Das bedeutet, dass - wenn Ihr Programm aus mehreren Übersetzungseinheiten/Quelldateien besteht ( .c
o .cpp
) - die Funktion ist sichtbar in alle Übersetzungseinheiten/Quelldateien, die Ihr Programm hat.
Dies kann in einigen Fällen ein Problem darstellen. Was ist, wenn Sie z.B. zwei verschiedene Funktionen (Definitionen), aber mit demselben Funktionsnamen in zwei verschiedenen Kontexten (eigentlich dem Dateikontext) verwenden wollen.
In C und C++, die static
Speicherklassen-Qualifizierer, der auf eine Funktion im Dateisystem angewendet wird (nicht auf eine statische Mitgliedsfunktion einer Klasse in C++ oder einer Funktion innerhalb eines anderen Blocks) kommt nun zu Hilfe und bedeutet, dass die jeweilige Funktion nur innerhalb der Übersetzungseinheit/Quelldatei, in der sie definiert wurde, sichtbar ist und nicht in den anderen TLUs/Dateien.
"Wenn die Deklaration eines Dateibereichskennzeichens für ein Objekt oder eine Funktion den Spezifizierer für die Speicherklasse enthält statisch hat der Identifikator eine interne Verknüpfung. 30)"
- Eine Funktionsdeklaration kann den Speicherklassenspezifizierer static nur dann enthalten, wenn sie sich auf Dateiebene befindet; siehe 6.7.1.
Quelle: C18, 6.2.2/3
Daher ist A static
Funktion ist nur sinnvoll, wennf:
- Ihr Programm besteht aus mehreren Übersetzungseinheiten/Quelldateien (
.c
o .cpp
).
und
- Sie möchten den Geltungsbereich einer Funktion auf die Datei beschränken, in der die betreffende Funktion definiert ist.
Falls nicht ambos dieser Anforderungen übereinstimmen, brauchen Sie sich nicht den Kopf darüber zu zerbrechen, wie Sie eine Funktion als static
.
Randnotizen:
- Wie bereits erwähnt, ist A
static
Funktion hat absolut Keinerlei Unterschied zwischen C und C++, da dies ein Merkmal ist, das C++ von C geerbt hat.
Es spielt keine Rolle, dass in der C++-Gemeinschaft eine herzzerreißende Debatte über die Abwertung von Funktionen geführt wird, die als static
im Vergleich zur Verwendung von unbenannte Namespaces stattdessen durch einen falsch platzierten Absatz im C++03-Standard initiiert, der die Verwendung statischer Funktionen für veraltet erklärte und bald darauf vom Ausschuss selbst überarbeitet und in C++11 entfernt wurde.
Dies war Gegenstand verschiedener SO-Fragen:
Unbenannte/anonyme Namensräume vs. statische Funktionen
Überlegenheit des unbenannten Namensraums gegenüber dem statischen?
Warum ist ein unbenannter Namespace eine "bessere" Alternative zu statisch?
Ausmusterung des Schlüsselworts static... nicht mehr?
In der Tat ist sie laut C++-Standard noch nicht veraltet. Daher ist die Verwendung von static
Funktionen ist immer noch legal. Auch wenn unbenannte Namespaces Vorteile haben, ist die Diskussion über die Verwendung oder Nichtverwendung statischer Funktionen in C++ der eigenen Meinung unterworfen und damit für diese Website nicht geeignet.