[ Pobierz całość w formacie PDF ]

przykładach lub pojawiają się w kodzie tworzonym automatycznie przez C++Builder.
Dyrektywa #include
O dyrektywie #include wspomniałem już w drugim rozdziale. Zwróciliśmy wówczas
uwagę na to, że nazwy plików umieszczone za nią mogą być otoczone nawiasami
lub cudzysłowem " ". Wpływa to na ścieżkę przeszukiwania katalogów, w których
poszukiwany jest włączany do kodu plik. W przypadku nawiasów plik szukany jest
w katalogach, które w opcjach środowiska wskazane są jako katalogi zawierające pliki
nagłówkowe (menu Project\Options& , gałąz C++ Compiler (bcc32)\Paths and Defines,
pozycja Include search path). Jeżeli zamiast w nawiasach, nazwę pliku umieścimy w cu-
dzysłowach, to będzie on szukany przede wszystkim w bieżącym katalogu, a dopiero je-
żeli nie zostanie tam odnaleziony, przeszukane zostaną katalogi z plikami nagłówkowymi.
Ta różnica powoduje, że pliki nagłówkowe bibliotek standardowych dostarczanych razem
z kompilatorem dołącza się, korzystając z nawiasów:
#include
natomiast nagłówki modułów należących do bieżącego projektu, korzystając z cudzy-
słowu:
#include "Unit1.h"
Dyrektywy kompilacji warunkowej
Bardzo ważne są dyrektywy #if, #else i #endif, które pozwalają na sterowaniem prze-
biegiem kompilacji. Listing 3.42 zawiera przykład, w którym sprawdzana jest wersja
kompilatora i ewentualnie wyświetlana informacja o wykryciu C++Builder 2006. Można
sobie jednak wyobrazić, że od wersji kompilatora zależy coś poważniejszego, np. dołą-
czenie odpowiednich plików nagłówkowych.
Listing 3.42. Treść komunikatu zależy od wersji kompilatora
#if __BORLANDC__ >= 0x5=0
ShowMessage("WEkrEtE kompilator: C++Builder 2006 lub nowszE");
#else
ShowMessage("Starsza wersja kompilatora");
#endif
Należy zwrócić uwagę, że znaczenie dyrektyw z listingu 3.42, pomimo podobnego
efektu, jest zupełnie inne niż konstrukcji C++ if..else. W przypadku dyrektywy #if
wybór instrukcji, która ma być wykonana, dokonuje się już w momencie kompilacji,
a zatem do skompilowanego pliku trafia tylko jedna opcja.
88 Część I f& Zintegrowane środowisko programistyczne i język programowania C++
Stałe preprocesora
Stała __BORLANDC__ zdefiniowana została w bibliotekach kompilatora bcc32 za pomocą
dyrektywy #define, zapewne w następujący sposób:
#define __BORLANDC__ 0x5=0
Oczywiście ta stała pojawia się tylko w kompilatorze C++ firmy Borland. Jeżeli przy-
gotowujemy kod, który może być kompilowany w innych środowiskach, to musimy
uwzględnić fakt, że ta stała w ogóle nie jest zdefiniowana11. Służą do tego dyrek-
tywy #ifdef i #ifndef. Pierwsza reaguje na obecność stałej, druga na jej brak. Oto
przykład:
Listing 3.43. A co, gdy stała w ogóle nie jest zdefiniowana?
#ifdef __BORLANDC__
#if __BORLANDC__ >= 0x5=0
ShowMessage("WEkrEtE kompilator: C++Builder 2006 lub nowszE");
#else
ShowMessage("Starsza wersja kompilatora");
#endif
#else
ShowMessage("Nie wEkrEto kompilatora firmE Borland");
#endif
Ze względu na możliwości optymalizacji kodu przez kompilator i możliwość wystą-
pienia trudnych do wytropienia błędów, nie należy dyrektywy #define używać do de-
finiowania typów, np. #define pdouble double* (zamiast tego należy użyć instrukcji
C++ tEpedef np. tEpedef double* pdouble;), oraz do definiowania stałych (do tego
należy używać zmiennych z modyfikatorem const).
Bardzo ważnym zastosowaniem dyrektyw #define i #ifndef jest ochrona plików na-
główkowych przed wielokrotnym włączaniem za pomocą dyrektywy #include. Za-
gadnienie to zostanie omówione szczegółowo w rozdziale 5.
Makra
Dyrektywa #define może być użyta z argumentem, co pozwala na definiowanie tzw.
makr, np.:
#define _kwadrat(arg) (arg*arg)
Makra są jednak bardzo silnym narzędziem i przez to zbyt niebezpiecznym. W mo-
mencie kompilacji  ciało makra jest wstawiane w każde miejsce wystąpienia jego
nazwy  to może czasem prowadzić do zupełnie zaskakujących rezultatów.
11
Wszystkie kompilatory pozwalają na identyfikację za pomocą stałych preprocesora np. _MSC_VER
(Visual C++), __GNUC__ (g++), _CRAYC (Cray CC), __SUNPRO_CC (Sun CC) itd.
Rozdział 3. f& Typy zmiennych i instrukcje sterujące 89
Makra i stałe preprocesora (także generalnie nazywane makrami) mogą być również
usunięte i w konsekwencji niewidoczne dla dalszej części kodu. Służy do tego dy-
rektywa #undef.
Zadania
Usilnie namawiam, aby Czytelnik, zanim przejdzie do kolejnych rozdziałów, poświę- [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • juli.keep.pl