Ich verstehe, dass eine statische Funktion in C erlaubt, dass diese bestimmte Funktion nur innerhalb der Grenzen dieser Datei aufgerufen wird. Was mich interessiert, ist, wie dies geschieht. Wird es in einen bestimmten Teil des Speichers eingefügt oder wendet der Compiler eine bestimmte Operation auf diese Funktion an? Kann dieser gleiche Prozess auf einen Funktionsaufruf in der Baugruppe angewendet werden?
Das Deklarieren einer Funktion static
verhindert nicht wirklich, dass sie von anderen Übersetzungseinheiten genannt wird.
Was static
tut, ist, dass verhindert wird, dass die Funktion von anderen Übersetzungseinheiten namentlich referiert ( verlinkt ) wird. Das wird die Möglichkeit von direkten Aufrufen für diese Funktion eliminieren, d. H. Aufrufe "nach Namen". Um dies zu erreichen, schließt der Compiler einfach den Funktionsnamen aus der Tabelle der externen Namen aus, die von der Übersetzungseinheit exportiert wurden. Ansonsten gibt es an statischen Funktionen absolut nichts Besonderes.
Sie können diese Funktion noch auf andere Weise von anderen Übersetzungseinheiten aufrufen . Wenn Sie beispielsweise einen Zeiger auf static
-Funktion in einer anderen Übersetzungseinheit erhalten haben, können Sie ihn über diesen Zeiger aufrufen.
Funktionen und andere Namen werden als Symbole in die Objektdatei exportiert. Der Linker verwendet diese Symbole, um alle Arten von Dangling-Referenzen zur Verbindungszeit aufzulösen (z. B. ein Aufruf einer Funktion, die in einer anderen Datei definiert ist). Wenn Sie static
deklarieren, wird es einfach nicht als Symbol exportiert. Daher wird es von keiner anderen Datei aufgenommen. Sie könnten es immer noch aus einer anderen Datei aufrufen, wenn Sie einen Funktionszeiger darauf hätten.
Es ist in der Tat das Gegenteil. Wenn eine Funktion nicht statisch ist, wird ihr Name irgendwo in die Objektdatei geschrieben, die der Linker dann verwenden kann, um andere Objektdateien mit dieser Funktion mit der Adresse dieser Funktion zu verknüpfen.
Wenn die Funktion static
deklariert wird, wird der Name des Compilers einfach nicht angegeben.