C/Używanie kompilatora
Z Wikibooks, biblioteki wolnych podręczników.
Język C jest językiem kompilowanym, co oznacza, że potrzebuje specjalnego programu - kompilatora - który tłumaczy kod źródłowy, pisany przez człowieka, na język rozkazów danego komputera. W skrócie działanie kompilatora sprowadza się do czytania tekstowego pliku z kodem programu, raportowania ewentualnych błędów i produkowania pliku wynikowego.
Kompilator uruchamiamy ze Zintegrowanego Środowiska Programistycznego lub z konsoli (linii poleceń). Przejść do konsoli można dla systemów typu UNIX w trybie graficznym użyć programów gterminal, konsole albo xterm, w Windows "Wiersz polecenia" (można go znaleźć w menu Akcesoria albo uruchomić wpisując w Start -> Uruchom... "cmd").
Spis treści |
[edytuj] GCC
GCC jest to darmowy zestaw kompilatorów, m.in. języka C rozwijany w ramach projektu GNU. Dostępny jest on na dużą ilość platform sprzętowych, obsługiwanych przez takie systemy operacyjne jak: AIX, *BSD, Linux, Mac OS X, SunOS, Windows. Na niektórych systemach (np. Windows) nie jest on jednak dostępny automatycznie. Należy zainstalować odpowiednie narzędza (poprzedni rozdział).
Aby skompilować kod języka C za pomocą kompilatora GCC, napisany wcześniej w dowolnym edytorze tekstu, należy uruchomić program z odpowiednimi parametrami. Podstawowym parametrem, który jest wymagany, jest nazwa pliku zawierającego kod programu który chcemy skompilować.
gcc kod.c
- Rezultatem kompilacji będzie plik wykonywalny, z domyślną nazwą (w systemach Unix jest to "a.out").
Jest to metoda niezalecana, ponieważ w przypadku, gdy skompilujemy w jednym katalogu kilka plików z kodem, kolejne pliki wykonywalne zostaną nadpisane i w rezultacie otrzymamy tylko jeden (ostatni) skompilowany kod. Aby wymusić na GCC nazwę pliku wykonywalnego musimy skorzystać z parametru "-o <nazwa>":
gcc -o program kod.c
- W rezultacie otrzymujemy plik wykonywalny o nazwie program.
Pracując nad złożonym programem składającym się z kilku plików źródłowych (.c), możemy w:Kompilacja (informatyka) skompilować je niezależnie od siebie, tworząc tak zwane pliki typu obiekt, z rozszerzeniem .o (ang. Object File). Następnie możemy stworzyć z nich jednolity program w procesie konsolidacji (linkowaniu). Jest to bardzo wygodne i praktyczne rozwiązanie ze względu na to, iż nie jesteśmy zmuszeni kompilować wszystkich plików tworzących program za każdym razem na nowo, a jedynie te, w których wprowadziliśmy zmiany Aby skompilować plik bez linkowania używamy parametru "-c <plik>":
gcc -o program1.o -c kod1.c gcc -o program2.o -c kod2.c
Otrzymujemy w ten sposób pliki typu obiekt program1.o i program2.o. A następnie tworzymy z nich program główny:
gcc -o program program1.o program2.o
Możemy użyć również flag, m.in. aby włączyć dokładne, rygorystyczne sprawdzanie napisanego kodu (co może być przydatne, jeśli chcemy dążyć do perfekcji), używamy przełączników:
gcc kod.c -o program -Werror -Wall -W -pedantic -ansi
Więcej informacji na temat parametrów i działania kompilatora GCC można znaleźć na:
- Strona domowa projektu GNU GCC
- Ogólny opis opcji kompilatora gcc po polsku
- Strona podręcznika systemu UNIX (man)
[edytuj] Borland
Zobacz podręcznik Borland C++ Compiler.
[edytuj] Czytanie komunikatów o błędach
Jedną z najbardziej podstawowych umiejętności, które musi posiąść początkujący programista jest umiejętność rozumienia komunikatów o różnego rodzaju błędach, które sygnalizuje kompilator. Wszystkie te informacje pomogą Ci szybko wychwycić ewentualne błędy (których na początku zawsze jest bardzo dużo). Nie martw się, że na początku dość często będziesz oglądał wydruki błędów, zasygnalizowanych przez kompilator - nawet zaawansowanym programistom się to zdarza. Kompilator ma za zadanie pomóc Ci w szybkiej poprawie ewentualnych błędów, dlatego też umiejętność analizy komunikatów o błędach jest tak ważna.
[edytuj] GCC
Kompilator jest w stanie wychwycić błędy składniowe, które z pewnością będziesz popełniał. Kompilator GCC wyświetla je w następującej formie:
nazwa_pliku.c:numer_linijki:opis błędu
Kompilator dość często podaje także nazwę funkcji, w której wystąpił błąd. Przykładowo, błąd deklaracji zmiennej w pliku test.c:
#include <stdio.h> int main () { intr r; printf ("%d\n", r); }
Spowoduje wygenerowanie następującego komunikatu o błędzie:
test.c: In function ‘main’: test.c:5: error: ‘intr’ undeclared (first use in this function) test.c:5: error: (Each undeclared identifier is reported only once test.c:5: error: for each function it appears in.) test.c:5: error: syntax error before ‘r’ test.c:6: error: ‘r’ undeclared (first use in this function)
Co widzimy w raporcie o błędach? W linii 5 użyliśmy nieznanego (undeclared) identyfikatora intr - kompilator mówi, że nie zna tego identyfikatora, jest to pierwsze użycie w danej funkcji i że więcej nie ostrzeże o użyciu tego identyfykatora w tej funkcji. Ponieważ intr nie został rozpoznany jako żaden znany typ, linijka intr r; nie została rozpoznana jako deklaracja zmiennej i kompilator zgłasza błąd składniowy (syntax error). W konsekwencji r nie zostało rozpoznane jako zmienna i kompilator zgłosi to jeszcze w następnej linijce, gdzie używamy r.