`static` bei C Funktionen
« | 15 Feb 2020 | »Ich wurde gelegentlich schon in unterschiedlichen Projekten gefragt, wieso ich
vor Funktionen häufig ein static
davor setze.
Die kurze Antwort darauf ist einfach:
Weil es dort hingehört.
Doch wie so oft im Leben, liegt auch hier viel individuelle Meinung vor, die ich aber gerne zu rechtfertigen bereit bin.
Eine freie globale Funktion hat in C
und C++ von Natur aus den Status einer
extern
-en Sichtbarkeit, nur dass in reinem C eine C-Nomenklatur zum Einsatz
kommt, während in CPP Dateien eine C++-Benamung stattfindet
(siehe: Name mangling).
Und dieser Umstand fällt vor allem dann auf, wenn
(unter Nicht-Windows-Systemen) eine dynamische Bibliothek erstellt wird.
Alle Funktionen werden dort automatisch exportiert und sind von außen
aufrufbar, außer man deaktiviert die Sichtbarkeit per Compiler-Parameter.
Und so kommt es, dass große Softwarehersteller in ihren mitgelieferten
Bibliotheken öffentliche Funktionen mitliefern, die viele Dinge bewirken,
die der Hersteller gar nicht wollte.
Am lustigsten sind Funktionen, die einen Lizenz- oder Kopierschutz deaktivieren
oder eine Entschlüsselung von sensiblen Daten anbieten, die eigentlich
verborgen sein sollten.
Eine static
Funktion ist nur in der Übersetzungseinheit (also in DER *.c
oder *.cpp
Datei) sichtbar, wo sie implementiert ist. Sie kann nicht
(ohne Kunstgriffe) von außen aufgerufen oder in einer DLL
oder SO exportiert
werden.
Daher nun meine lange Antwort auf die ursprüngliche Frage:
Jede Hilfsfunktion ist zwingend als
static
zu deklarieren, außer man wünscht explizit, dass sie in öffentlichen Schnittstellen aufscheint.
Und so ist ja meistens. Wir haben im Header eine Funktion deklariert, die entweder intern oder extern sichtbar sein soll. Und die Implementierung dieser Funktion nutzt eine Vielzahl kleiner Hilfsroutinen um den Code besser zu strukturieren, doch eben diese Helfer wollen wir nicht öffentlich aufscheinen lassen.
Fazit
Ich glaube, dass static
ein bisschen in Vergessenheit geraten ist und
bemerkte schon in unterschiedlichen Projekten, dass DLLs und SOs mit
zahlreichen Funktionsnahmen gefüllt sind, die eigentlich nicht veröffentlicht
werden sollten.
Deshalb habe ich mir angewöhnt static
so häufig wie möglich einzusetzen.
Das Resultat sind dann aufgeräumtere Export-Tabellen.
… sollte sich also wieder mal wer wundern warum im GATE Code oder anderen
meiner Schreibereien so oft static
vorkommt, dann sei dies hier die
Rechtfertigung. ;)