`static` bei C Funktionen

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. ;)