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

Usunięta treść Dodana treść
Kj (dyskusja | edycje)
Pokolorowano kod
Linia 9:
===Budowa pliku nagłówkowego===
Oto najprostszy możliwy plik nagłówkowy:
<source lang="c">
#ifndef PLIK_H
#define PLIK_H
/* tutaj są wpisane deklaracje funkcji */
#endif /* PLIK_H */
</source>
 
Zapewne zapytasz się na co komu instrukcje <tt>[[C/Preprocesor##ifdef #ifndef #else #endif|#ifndef]]</tt>, <tt>#define</tt> oraz <tt>#endif</tt>. Otóż często się zdarza, że w programie korzystamy z plików nagłówkowych, które dołączają się wzajemnie. Oznaczałoby to, że w kodzie programu kilka razy pojawiła by się zawartość tego samego pliku nagłówkowego. Instrukcja <tt>#ifndef</tt> i <tt>#define</tt> temu zapobiega. Dzięki temu kompilator nie musi kilkakrotnie kompilować tego samego kodu.
 
Linia 23:
Załóżmy, że nasza biblioteka będzie zawierała jedną funkcję, która wypisuje na ekran tekst "pl.Wikibooks". Utwórzmy zatem nasz plik nagłówkowy:
 
<source lang="c">
#ifndef WIKI_H
#define WIKI_H
void wiki (void);
#endif
</source>
 
Należy pamiętać, o podaniu void w liście argumentów funkcji nie przyjmujących argumentów. O ile przy definicji funkcji nie trzeba tego robić (jak to często czyniliśmy w przypadku funkcji main) o tyle w prototypie brak słówka void oznacza, że w prototypie nie ma informacji na temat tego jakie argumenty funkcja przyjmuje.
Linia 33 ⟶ 35:
Teraz napiszmy ciało tej funkcji:
 
<source lang="c">
#include "wiki.h"
#include <stdio.h>
Linia 40 ⟶ 43:
printf ("pl.Wikibooks\n");
}
</source>
 
Ważne jest dołączenie na początku pliku nagłówkowego. Dlaczego? Plik nagłówkowy zawiera deklaracje naszych funkcji - jeśli popełniliśmy błąd i deklaracja nie zgadza się z definicją, kompilator od razu nas o tym powiadomi. Oprócz tego plik nagłówkowy może zawierać definicje istotnych typów lub makr.
Linia 50 ⟶ 54:
Teraz możemy spokojnie skorzystać z naszej nowej biblioteki. Napiszmy nasz program:
 
<source lang="c">
#include "wiki.h"
Linia 57 ⟶ 62:
return 0;
}
</source>
 
Zapiszmy program jako "main.c"
Linia 77 ⟶ 83:
'''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:
 
<source lang="c">
/* biblioteka.h */
'''extern char zmienna_dzielona[];'''
 
/* biblioteka.c */
Linia 94 ⟶ 101:
return 0;
}
</source>
 
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.