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

Usunięta treść Dodana treść
m Update syntaxhighlight tags - remove use of deprecated <source> tags
Linia 100:
===Budowa pliku nagłówkowego===
Oto najprostszy możliwy plik nagłówkowy:
<sourcesyntaxhighlight lang="c">
#ifndef PLIK_H
#define PLIK_H
/* tutaj są wpisane deklaracje funkcji */
#endif
</syntaxhighlight>
</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 114:
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:
 
<sourcesyntaxhighlight lang="c">
#ifndef WIKI_H
#define WIKI_H
Linia 120:
void wiki (void) {printf("pl.Wikibooks\n");}
#endif
</syntaxhighlight>
</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 129:
Napiszmy nasz program:
 
<sourcesyntaxhighlight lang="c">
#include "wiki.h"
Linia 137:
return 0;
}
</syntaxhighlight>
</source>
 
Zapiszmy program jako "main.c"
Linia 155:
'''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:
 
<sourcesyntaxhighlight lang="c">
/* biblioteka.h */
#ifndef BIBLIOTEKA_H
Linia 175:
return 0;
}
</syntaxhighlight>
</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.