Sytuacja wygląda tak – mamy zestaw trzech symboli, o zasięgu globalnym (dotyczących całego projektu). Kompilacja ma zostać przerwana w momencie, gdy żaden z trzech symboli nie jest zdefiniowany, lub jeśli zdefiniowanych jest więcej niż jeden. Dla przykładu, nazwijmy te symbole FOO
, BAR
, BAZ
.
Całość można załatwić kupką $DEFINED
-ów, np. w poniższy sposób:
{$IF NOT DEFINED(FOO) AND NOT DEFINED(BAR) AND NOT DEFINED(BAZ)}
{$FATAL needed symbol is not defined}
{$ELSEIF (DEFINED(FOO) AND DEFINED(BAR)) OR (DEFINED(FOO) AND DEFINED(BAZ)) OR (DEFINED(BAR) AND DEFINED(BAZ))}
{$FATAL too many symbols defined}
{$ENDIF}
Pierwsza linijka warunków sprawdza czy którykolwiek został zdefiniowany, druga czy nie jest ich co najmniej dwa. Całość działa prawidłowo – poprawnie wykrywa brak symboli lub ich nadmiar. Problem w tym, że strasznie tego dużo – niezbyt to czytelne (choć użyłem trzyliterowych symboli, w oryginale składają się z liter kilkunastu) i łatwo się pomylić przy wypisywaniu wymaganych permutacji.
A co jeśli miałbym tych symboli pięć? Albo więcej? Trzeba by cały ekran zawalić tymi $DEFINED
-ami, co było by kompletnie nieczytelne… Czy jest jakiś lepszy (przede wszystkim którszy) sposób na wykonanie takiej walidacji?
Szkoda, że $DEFINED
nie pozwala na grupowanie symboli… Mogłoby być przyjemnie:
{$IF NOT DEFINED(FOO,BAR,BAZ)}
{$FATAL needed symbol is not defined}
{$ELSEIF DEFINED(FOO,BAR) OR DEFINED(FOO,BAZ) OR DEFINED(BAR,BAZ)}
{$FATAL too many symbols defined}
{$ENDIF}
Niestety to nie przejdzie. :/