2013-02-17 11 views
10

Ich weiß, dass die Verwendung des Schlüsselwortes static in C auf einer Funktion die Funktion auf die Kompilierungseinheit beschränkt, in der sie definiert ist. Ich untersuche nun die Symbolsichtbarkeit und bin etwas verwirrt über den Unterschied zwischen static Funktionen und Funktionen, die mit __attribute__((visibility("hidden"))) markiert sind, oder über die Befehlszeilenoption -fvisibility=hidden.Was ist der praktische Unterschied zwischen einer statischen Funktion und einer Funktion mit dem "versteckten" Sichtbarkeitsattribut?

Ich habe das Gefühl, dass die Art und Weise, wie diese Dinge unter der Haube ändern, nicht das Gleiche ist, aber ich weiß nicht, was der Unterschied ist und was es bedeutet, wenn man mit ihnen im eigentlichen Code arbeitet. Was ändert sich zwischen den beiden und wann möchtest du eins über dem anderen benutzen?

Antwort

12

eine Funktion mit __attribute__((visibility("hidden"))) außerhalb der gemeinsam genutzten Bibliothek nicht sichtbar es enthält, aber wenn diese Bibliothek wurde hergestellt durch foo.pic.o und bar.pic.o Eine solche Funktion kann in Verknüpfung fhidfoo.c und rief von bar.c definiert werden. Natürlich kann externer Code (z. B. aus dem Hauptprogramm oder einer anderen gemeinsam genutzten Bibliothek) nicht fhid

aufrufen. Daher gilt die versteckte Sichtbarkeit für eine gesamte gemeinsam genutzte Bibliothek und nicht für einzelne Kompilierungseinheiten, aus denen sie besteht.

Im Gegensatz dazu wäre es möglich gewesen, foo.c eine static void fsta(void) Funktion zu definieren, und für bar.c eine verschiedenestatic void fsta(void) Funktion zu definieren (auch wenn diese schlechte Geschmack und sollte aus Gründen der Lesbarkeit Gründen vermieden werden).

Im Prinzip könnte auch eine static-Funktion leichter inline sein, oder der Compiler könnte (manchmal) verschiedene Aufrufkonventionen dafür verwenden.

+0

aber nicht von außerhalb der DLL +1 –

0

Verborgene Sichtbarkeit anzeigt, dass das Symbol nicht in die dynamische Symboltabelle platziert werden, so dass keine andere „Modul“ (executable oder Shared Library) kann sie direkt referenzieren.

http://ohse.de/uwe/articles/gcc-attributes.html

kann ich hinzufügen: Sie __attribute__((visibility("hidden"))) in C++ mit Semantik der Nähe von C-Version von static verwenden können.

+0

Nicht genau: Sie können zwei verschiedene 'statische' Funktionen mit dem gleichen Namen' f' in zwei verschiedenen Kompilierungseinheiten haben. Sie können nicht 2 solcher Funktionen "f" mit versteckter Sichtbarkeit haben –

4

Wenn Sie eine global Funktion in einer gemeinsamen Bibliothek haben Sie würden wollen, nur im Rahmen der gemeinsam genutzten Bibliothek verwendet werden, aber nicht außerhalb der gemeinsam genutzten Bibliothek - dann müssen Sie __attribute__((visiblity("hidden")))

Zum Beispiel:

Wenn Sie eine Funktion void foo() in Foo.c definiert, und Sie würden es von Bar.c und Baz.c beziehen möchten, die Übersetzungseinheiten sind FooBarBaz.dll (oder FooBarBaz.so) zu erzeugen, dann können Sie die Funktion als

machen

Denken Sie daran, foo() wird nicht für die ausführbare Datei sichtbar sein, die die dll (oder die.so Datei) paper

Verwandte Themen