+ Kompilacja warunkowa
→Niezdefiniowane zachowanie i zachowanie zależne od implementacji: mam nadzieję, że jaśniejszy opis |
+ Kompilacja warunkowa |
||
Linia 146:
== Biblioteczne problemy ==
Pisząc programy nieraz będziemy musieli korzystać z różnych bibliotek. Problem polega na tym, że nie zawsze będą one dostępne na komputerze, na którym inny użytkownik naszego programu będzie próbował go kompilować. Dlatego też ważne jest, abyśmy korzystali z łatwo dostępnych bibliotek, które dostępne są na wiele różnych systemów i platform sprzętowych. '''Zapamiętaj''': Twój program jest na tyle przenośny na ile przenośne są biblioteki z których korzysta!
== Kompilacja warunkowa ==
Przy zwiększaniu przenośności kodu może pomóc preprocessor. Przyjmijmy np., że chcemy korzystać ze słówka kluczowego inline wprowadzonego w standardzie C99, ale równocześnie chcemy, aby nasz program był rozumiany przez kompilatory ANSI C. Wówczas, możemy skorzystać z następującego kodu:
#ifndef __inline__
# if __STDC_VERSION__ >= 199901L
# define __inline__ inline
# else
# define __inline__
# endif
#endif
a w kodzie programu zamiast słówka inline stosować __inline__. Co więcej, kompilator GCC rozumie słówka kluczowe tak tworzone i w jego przypadku warto nie redefiniować ich wartości:
#ifndef __GNUC__
# ifndef __inline__
# if __STDC_VERSION__ >= 199901L
# define __inline__ inline
# else
# define __inline__
# endif
# endif
#endif
Korzystając z kompilacji warunkowej można także korzystać z różnego kodu zależnie od (np.) systemu operacyjnego. Przykładowo, przed kompilacją na konkretnej platformie tworzymy odpowiedni plik config.h, który następnie dołączamy do wszystkich plików źródłowych, w których podejmujemy decyzje na podstawie zdefiniowanych makr. Dla przykładu, plik config.h:
#ifndef CONFIG_H
#define CONFIG_H
/* Uncomment if using Windows */
/* #define USE_WINDOWS */
/* Uncomment if using Linux */
/* #define USE_LINUX */
#error You must edit config.h file
#error Edit it and remove those error lines
#endif
Jakiś plik źródłowy:
#include "config.h"
/* ... */
#ifdef USE_WINDOWS
rob_cos_wersja_dla_windows();
#else
rob_cos_wersja_dla_linux();
#endif
Istnieją różne narzędzia, które pozwalają na automatyczne tworzenie takich plików config.h, dzięki czemu użytkownik przed skompilowaniem programu nie musi się trudzić i edytować ich ręcznie, a jedynie uruchomić odpowiednie polecenie. Przykładem jest zestaw autoconf i automake.
<noinclude>
|