The structure of conditional assembly is much like that used by high-level language conditional constructs and the C pre-processor. The directives IF, IFDEF, IFNDEF, ELIF, and ENDIF are all available. These directives may be prefixed with a # and can start in the first column to enable them to look like C pre-processor directives. These directives may also be prefixed with a . character for compatibility with other assemblers.

##### Syntax

> IF expression
> statements
> { ELIF expression
> statements }
> [ ELSE
> statements ]
> ENDIF

> IFDEF symbol
> ....
> IFNDEF symbol
> ....

The controlling expression must be an absolute assembly-time constant. When the expression is non-zero the true conditional arm is assembled; when the expression is zero the false conditional body, if any, is assembled.

The IFDEF and IFNDEF directives are specialised forms of the IF directive. The IFDEF directive tests the existence of the supplied symbol and the IFNDEF directive tests the non-existence of the supplied symbol.

##### Example

    IF type == 1
       CALL type1
    ELSE
       IF type == 2
          CALL type2
       ELSE
          CALL type3
       ENDIF
    ENDIF

The nested conditional can be replaced using the ELIF directive which acts like ELSE IF:

    IF type == 1
       CALL type1
    ELIF type == 2
       CALL type2
    ELSE
       CALL type3
    ENDIF

##### Example

Usual practice is to use a symbol, _DEBUG, as a flag to either include or exclude debugging code. Now you can use IFDEF to conditionally assemble some parts of your application depending upon whether the _DEBUG symbol is defined or not.

    IFDEF _DEBUG
       CALL DumpAppState
    ENDIF