153
JAK ZBUDOWANA JEST BIBLIOTEKA
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 «k> ręki dwa narzę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 */
Sinclude "biblioteka.h"
char zaienna_dzielona[] = "Zawartość";
/* main.c •/
•include <stdio.h>
•include "biblioteka.h"
int mainO
{
printf("%s\n", zmienna_dzielona); return 0;
>
Gdybyśmy tu nie zastosowali extern. kompilator (nie linker) zaprotestowałby, że nie zna zmiennej zmiemuudzieUma. Próba dopisania deklaracji char zaicnna dzielona; stworzyłaby nową zmienną i utracilibyśmy dostęp <k> 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 glolMtlnych. Powoduje, że dana zmienna lub funkcja jest niedostępna na zewnątrz biblioteki1. Możemy dzięki temu ukryć np. funkcje, które używane są przez samą bibliotekę, by nie dało się icłi wykorzystać przez extern.
'Tak naprawdę cale “ukrycie" funkcji |x>lega na zmianie niektórych danych w pliku z kodem binarnym danej biblioteki (pliku o), przez co linker |>owodujc wygenerowanie komunikatu o błędzie w czasie łączenia biblioteki z programem.