Słyszeliście o terminie "kompilacja warunkowa"? Działa bardzo podobnie jak zwykła instrukcja warunkowa z tą różnicą, że tłumaczy odpowiedni fragment kodu źródłowego w zależności od spełnienia warunku. Wynik warunku jest zależny od stałych preprocesora! W ten sposób staje się możliwe tworzenie o wiele bardziej przenośnych programów na różne platformy bez duplikowania kodów źródłowych! O tym, jak z tego korzystać i jak to wygląda w praktyce piszę poniżej.

KOMPILACJA WARUNKOWA W SZCZEGÓŁACH

Wyobraźmy sobie prostą instrukcję "if", która posiada jakiś konkretny warunek (na przykład "x < 5"). W środku bloku instrukcji wyobrażamy sobie jakieś polecenia. Czy to się spełni, czy nie, będzie to uwzględnione przez kompilator. Może to się stać albo nie. Mamy to? To teraz wyobraźcie sobie, że kompilacja warunkowa zamiast instrukcji warunkowej korzysta z dyrektywy, a instrukcje istnieją fizycznie w pliku wykonywalnym po tłumaczeniu na kod maszynowy wtedy i tylko wtedy, gdy stała osadzona jako warunek pochodząca z dyrektywy "#define" istnieje, to znaczy została zdefiniowana. Tym się różni jedno od drugiego. Ponadto jeszcze taki drobiazg, że kompilacja jest wykonywana tylko na początku, zatem tylko jeden raz dochodzi do sprawdzenia warunków na etapie działania preprocesora. Instrukcja warunkowa jest w kodzie zawsze i podlega wielokrotnym testom. Trochę pokrętnie napisane jednak nie byłem w stanie ułożyć tych faktów bardziej konstruktywnie.

W pytaniu o użyteczność, kompilacja warunkowa bardzo się przydaje przy zapewnianiu przenośności kodu na wiele platform i systemów. Na przykład moja kolejna gra jest na razie tworzona pod system Windows, ale dzięki kompilacji warunkowej, będę w stanie operować na TYM SAMYM projekcie (to jest bardzo istotny fakt!) i budować sterowanie i funkcjonalność również na HTML5 oraz Android. Potem wystarczy jedynie zmienić odpowiednie stałe dostosowane do odpowiedniej platformy, skompilować kod i tym sposobem uzyskać ten sam produkt, tylko dostosowany do innej platformy niż Windows.

KOMPILACJA WARUNKOWA W KODZIE ŹRÓDŁOWYM

Więcej wyjaśnień nie trzeba jak na artykuł strony internetowej. Pora to podsumować prostym kodem źródłowym. Mamy oto taki plik, który wypisuje odpowiednią treść komunikatu w zależności od zdefiniowanych stałych. Zerknijcie najpierw na niego:

#include <stdio.h>

#define X

#ifdef X
#define N 50
#else
#define N 100
#endif

#ifdef _WIN32
#define LOG "To jest system operacyjny Windows.\n"
#else
#define LOG "To jest jakis inny system operacyjny niz Windows.\n"
#endif

int main(void)
{
	printf(LOG);
	printf("Liczba pochodzaca ze stalej N wynosi %d.\n", N);
	getchar();
	
	return 0;
}

Kompilacja warunkowa jest wykorzystywana dwukrotnie: pierwszy raz to korzystanie z własnej stałej definiowanej pod nazwą "X". "#define" ma to do siebie, że nie trzeba podawać żadnej wartości. Od tego, czy stała "X" jest zdefiniowana, czy też nie, zależy zdefiniowanie wartości liczbowej dla stałej "N" (50 lub 100). Drugi raz wykazuje już poważniejszy przykład bo tutaj jest zależność od systemu operacyjnego i TO chciałem przekazać jako dużo ważniejsze zastosowanie. Stała "WIN32" oznacza czy system operacyjny na którym odbędzie się proces kompilacji jest Windowsem, czy innym systemem. Ponieważ nie posiadam Linuxa ani MacOS'a, to nie mogę sprawdzić czy to działa w sposób pożądany, natomiast nie powinno być żadnych sprzeczności. I tylko ten jeden raz przed kompilacją zostanie to przetestowane.


Sięgnęliśmy zakończenia tego krótkiego wątku. To jest kolejny "rodzynek w cieście" jeśli chodzi o istnienie czegoś takiego. Kompilacja warunkowa dotyczy tylko kilku języków z racji tego, że bardziej abstrakcyjne języki mogą tego po prostu nie potrzebować, na przykład Java.

PODOBNE ARTYKUŁY