2012-07-23 9 views

Odpowiedz

11

Nie przechodzi do tabeli nazw obiektu, co uniemożliwia połączenie go z innymi obiektami.

6

Funkcje i inne nazwy są eksportowane jako symbole w pliku obiektowym. Łącznik używa tych symboli do rozwiązywania wszelkiego rodzaju wiszących odniesień w czasie połączenia (na przykład wywołanie funkcji zdefiniowanej w innym pliku). Po zadeklarowaniu go jako static po prostu nie zostanie wyeksportowany jako symbol. Dlatego nie zostanie pobrane przez żaden inny plik. Możesz nadal wywoływać go z innego pliku, jeśli masz do niego wskaźnik funkcji.

2

Jest to wręcz przeciwnie. Gdy funkcja jest statyczna, jej nazwa jest zapisywana gdzieś w pliku obiektowym, który linker może następnie użyć do połączenia innych plików obiektów za pomocą tej funkcji z adresem tej funkcji.

Gdy funkcja jest zadeklarowana jako static, kompilator po prostu nie umieszcza tam nazwy.

12

Zgłaszanie funkcji static tak naprawdę nie uniemożliwia jej bycia o nazwie z innych jednostek tłumaczeniowych.

Co static robi to zapobiega funkcję od bycia mowa (związane) od pozostałych jednostek tłumaczeniowych według nazwy. To wyeliminuje możliwość wywoływania tej funkcji, to jest wywołuje "po nazwie". Aby to osiągnąć, kompilator po prostu wyklucza nazwę funkcji z tabeli nazw zewnętrznych wyeksportowanych z jednostki tłumaczeniowej. Poza tym nie ma absolutnie nic specjalnego w statycznych funkcjach.

Nadal można zadzwonić pod numer, które działają z innych jednostek tłumaczeniowych w inny sposób. Na przykład, jeśli w jakiś sposób uzyskałeś wskaźnik do funkcji static w innej jednostce tłumaczeniowej, możesz wywołać ją za pomocą tego wskaźnika.

Powiązane problemy