In addition to the regular Turbo Pascal constructs for conditional compilation, the Free Pascal compiler also supports a stronger conditional compile mechanism: The {$IF} construct, which can be used to evaluate compile-time expressions.
The prototype of this construct is as follows:
{$if expr} CompileTheseLines; {$else} BetterCompileTheseLines; {$endif}
The content of an expression is restricted to what can be evaluated at compile-time:
Constants (strings, numbers)
Macros
Compile time variables (mode MacPas only)
Pascal constant expressions (mode Delphi only)
The symbols are replaced with their value. For macros recursive substitution might occur.
The following boolean operators are available:
=, <>, >, <, >=, <=, AND, NOT, OR, IN
The IN operator tests for presence of a compile-time variable in a set.
In addition, the following arithmetic operators are available:
+, -, *, /, div, mod, shl, shr
The usual precedence of operators applies.
The following functions are also available:
Defined in MacPas mode only, it evaluates to True. In other modes, 1 can be used.
Defined in MacPas mode only, it evaluates to False. In other modes, 0 can be used.
will evaluate to TRUE if a compile time symbol is defined. In MacPas mode, the parentheses are optional, i.e.
{$IF DEFINED(MySym)}
is equivalent to
{$IF DEFINED MySym}
will evaluate to TRUE if a compile time symbol is not defined, and FALSE otherwise (mode MacPas only).
evaluates to TRUE if a compiler option is set (mode MacPas only). It is equivalent to the {$IFOPT } directive.
Evaluates to the size of a pascal type, variable or constant.
Evaluates to TRUE if the pascal symbol is declared at this point in the sources, or FALSE if it is not yet defined.
In expressions, the following rules are used for evaluation:
If all parts of the expression can be evaluated as booleans (with 1 and 0 representing TRUE and FALSE), the expression is evaluated using booleans.
If all parts of the expression can be evaluated as numbers, then the expression is evaluated using numbers.
In all other cases, the expression is evaluated using strings.
If the complete expression evaluates to ’0’, then it is considered False and rejected. Otherwise it is considered True and accepted. This may have unexpected consequences:
{$if 0}
will evaluate to False and be rejected, while
{$if 00}
will evaluate to True.