C/Biblioteki: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
m poprawa nawigacji
Derbeth (dyskusja | edycje)
→‎Ograniczanie dostępu do funkcji i zmiennych: trochę jaśniejsze, najpierw extern, potem static
Linia 65:
Zauważmy, że kompilatorowi podajemy i pliki z kodem źródłowym (main.c) i pliki ze skompilowanymi bibliotekami (wiki.o) by uzyskać plik wykonywalny (main). Jeśli nie podalibyśmy plików z bibliotekami, main.c co prawda skompilowałby się, ale błąd zostałby zgłoszony przez linker - część kompilatora odpowiedzialna za wstawienie w miejsce wywołań funkcji ich adresów (takiego adresu linker nie mógłby znaleźć).
 
=== OgraniczanieZmiana dostępu do funkcji i zmiennych (static i extern) ===
Język C, w przeciwieństwie do swego młodszego krewnego - C++ nie posiada praktycznie ż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 narzędzia: '''staticextern''' oraz '''externstatic'''. Pierwsze z nichtych możesłów odnosićkluczowych sięinformuje zarówno do zmiennych jak i do funkcji. Powodujekompilator, że dana zmiennafunkcja lub funkcjazmienna jest niedostępna na zewnątrz biblioteki{{ref|1}}. Możemy dzieki temu ukryć np. funkcjeistnieje, któreale używanew innym przez samą bibliotekę. Drugie ze słów kluczowych ma dokładnie odwrotne działanie. Informuje kompilatormiejscu, że dana funkcja lub zmienna istnieje 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:
Linia 90:
 
Gdybyśmy tu nie zastosowali '''extern''', kompilator (nie linker) zaprotestowałby, że nie zna zmiennej ''zmienna_dzielona''. Próba dopisania deklaracji <tt>char *zmienna_dzielona;</tt> 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 [[C/Zmienne#static|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 biblioteki{{ref|1}}. Możemy dzieki temu ukryć np. funkcje, które używane są przez samą bibliotekę, by nie dało się ich wykorzystać przez '''extern'''.
 
{{note|1}}<small>Tak 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.</small>