Wie begrenzt C die Verwendung einer statischen Funktion auf ihre Datei?

8

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?

    
Blackninja543 23.07.2012, 14:05
quelle

4 Antworten

11

Es gelangt nicht in die Namenstabelle des Objekts, was verhindert, dass es mit anderen Dingen verknüpft wird.

    
djechlin 23.07.2012, 14:06
quelle
12

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.

    
AnT 23.07.2012 14:11
quelle
6

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.

    
FatalError 23.07.2012 14:07
quelle
2

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.

    
Shahbaz 23.07.2012 14:07
quelle

Tags und Links