JAK ZBUDOWANA JEST BIBLIOTEKA 153 Zmiana dostępu do funkcji i zmiennych (static i extern) Język C, w przeciwieństwie do swego młodszego krewnego — C++ nie posiada praktycz- nie żadnych mechanizmów ochrony kodu biblioteki przed modyfikacjami. C++ ma w swoim asortymencie m.in. sterowanie uprawnieniami różnych elementów klasy. Jednak programista, piszący program w C nie jest tak do końca bezradny. Autorzy C dali mu do ręki dwa na- rzędzia: extern oraz static . Pierwsze z tych słów kluczowych informuje kompilator, że dana funkcja lub zmienna istnieje, ale w innym miejscu, i zostanie dołączona do kodu programu w czasie łączenia go z biblioteką. extern przydaje się, gdy zmienna lub funkcja jest zadeklarowana w bibliotece, ale nie jest udostępniona na zewnątrz (nie pojawia się w pliku nagłówkowym). Przykładowo: /* biblioteka.h */ extern char zmienna_dzielona[]; /* biblioteka.c */ #include "biblioteka.h" char zmienna_dzielona[] = "Zawartosc"; /* main.c */ #include #include "biblioteka.h" int main() { printf("%s\n", zmienna_dzielona); return 0; } Gdybyśmy tu nie zastosowali extern , kompilator (nie linker) zaprotestowałby, że nie zna zmiennej zmienna dzielona . Próba dopisania deklaracji char zmienna dzielona; stworzyłaby nową zmienną i utracilibyśmy dostęp do interesującej nas zawartości. Odwrotne działanie ma słowo kluczowe static użyte w tym kontekście (użyte wewnątrz bloku tworzy zmienną statyczną, więcej informacji w rozdziale Zmienne). Może ono odnosić się zarówno do zmiennych jak i do funkcji globalnych. Powoduje, że dana zmienna lub funkcja jest niedostępna na zewnątrz bibliotek i 1. Możemy dzięki temu ukryć np. funkcje, które używane są przez samą bibliotekę, by nie dało się ich wykorzystać przez extern . 1Tak naprawdę całe “ukrycie” funkcji polega na zmianie niektórych danych w pliku z kodem binarnym danej biblioteki (pliku .o), przez co linker powoduje wygenerowanie komunikatu o błędzie w czasie łączenia biblioteki z programem.
... zobacz całą notatkę
Komentarze użytkowników (0)