Co to jest kompilacja warunkowa?

W programowaniu komputerowym kompilacja warunkowa opisuje zdolność kompilatora oprogramowania lub procesora kodu źródłowego do włączania lub ignorowania niektórych poleceń lub bloków kodu opartych na instrukcjach specyficznych dla języka, które nie są technicznie częścią specyfikacji podstawowego języka programowania. Polecenia używane do wyzwalania kompilacji warunkowej w programie są często nazywane dyrektywami preprocesora, chociaż mogą być również znane jako dyrektywy kompilatora, komentarze warunkowe lub definicje warunkowe. W zależności od używanego kompilatora lub języka dyrektywy warunkowe mogą być zmiennymi zdefiniowanymi przez użytkownika lub makrami albo mogą być również zmiennymi systemowymi ustawionymi przez kompilator lub system operacyjny. Kompilacja warunkowa jest często używana do konfigurowania pojedynczego zestawu plików kodu źródłowego, dzięki czemu można je kompilować w różnych środowiskach lub systemach operacyjnych bez konieczności wymiany lub zmiany plików źródłowych.

Definicje warunkowe używane do testowania kompilacji warunkowej mogą różnić się w zależności od języka, ale zazwyczaj są to makra lub inne wyrażenia metadanych poza zakresem normalnych zmiennych programu. W językach takich jak C, zmienne są zwykle makrami, które są odczytywane przez preprocesor. W większości przypadków makra nie są dostępne przez rzeczywisty kod źródłowy programu wykonywalnego, mimo że istnieją w tych samych plikach źródłowych.

Dyrektywy używane do testowania zdefiniowanych zmiennych warunkowych są szczątkowe i działają zgodnie z tą samą logiką, co instrukcja if-then. Podstawowe testy, które można przeprowadzić w przypadku kompilacji warunkowej, to określenie, czy wartość jest zdefiniowana, niezdefiniowana lub, w niektórych przypadkach, czy dwie zdefiniowane zmienne są równoważne. Same zmienne lub makra generalnie nie mają żadnej wartości znaczącej, ponieważ to właśnie ich definiowanie jest tym, czego dyrektywy sprawdzają. Jednak w przypadku niektórych języków i kompilatorów wartość zdefiniowanej zmiennej może mieć znaczenie, jeśli są one oceniane dla stanu logicznego.

Gdy kompilator napotka dyrektywy używane do kompilacji warunkowej, dyrektywy są oceniane w celu sprawdzenia, czy są testowane jako prawda lub fałsz. Jeśli prawda, kod następujący po dyrektywie jest kompilowany w normalny sposób; w przeciwnym razie kompilator całkowicie pominie kod zawarty w dyrektywie. Jest to w przeciwieństwie do warunkowych instrukcji logicznych w samym kodzie wykonywalnym programu, ponieważ nawet jeśli logika zawiera blok kodu, którego nie można wykonać, nadal będzie on interpretowany i kompilowany w większości przypadków. W przypadku warunkowych dyrektyw preprocesora pominięty kod nigdy nie jest dołączany, interpretowany ani kompilowany. Należy również zauważyć, że po przeanalizowaniu przez preprocesor wszystkich zmiennych warunkowych i dyrektyw nie są one kompilowane z resztą programu, ponieważ mają na celu jedynie przekazanie wskazówek kompilatorowi.

Kompilacja warunkowa jest najczęściej używana do dołączania lub wykluczania kodu, który jest specyficzny dla określonego systemu operacyjnego lub środowiska. Oznacza to, że biblioteki, które istnieją w jednym systemie operacyjnym, mogą być warunkowo dołączone, jeśli dyrektywy określają, że program jest kompilowany w tym systemie operacyjnym. Alternatywnie dyrektywy mogą być również używane do dołączania lub wykluczania kodu opartego na zmiennych zdefiniowanych przez użytkownika. Można to zrobić, aby debugowanie lub profilowanie kodu nie było uwzględnione w ostatecznej wersji programu lub aby niektóre funkcje można włączyć lub wyłączyć bez konieczności utrzymywania oddzielnych kopii kodu.