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