Jason. Cała informatyka w jednym miejscu!

Słyszeliście o terminie "kompilacja warunkowa"? Kompilacja warunkowa w języku C 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ę w środku :).

KOMPILACJA WARUNKOWA W JĘZYKU C 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 w języku C 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 warunkowa 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 w języku C 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, jestem w stanie operować na TYM SAMYM projekcie (to jest bardzo istotny fakt!) i budować sterowanie oraz 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 pod inną platformę.

PRZYKŁAD KODU ŹRÓDŁOWEGO

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. Najpierw na niego zerknijcie:

#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 w języku C jest wykorzystywana dwukrotnie: pierwszy raz to w chwili sprawdzania czy istnieje stała zdefiniowana 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 to Windows, czy jakiś inny. Ponieważ nie posiadam Linuxa ani MacOS'a, 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 jaka występuje w języku C, dotyczy tylko niektórych języków wysokiego poziomu z tego powodu, że bardziej abstrakcyjne języki mogą tego po prostu nie potrzebować, na przykład Java.

PODOBNE ARTYKUŁY