Preprocessor directives in AL

APPLIES TO: Business Central 2020 release wave 2 and later

In AL, like in other programming languages, preprocessor directives can be used to make code conditional, to suppress warnings, or to enable the ability to expand and collapse in code. Preprocessor directives can be divided into the following groups. For more information about each type, use the links provided in the following section.

Any code can be made conditional, including table fields, and checked using a conditional directive. To check code using a conditional directive, you must define a symbol to check. A symbol returns a boolean value: true or false. Symbols can be defined at the beginning of a source file, where the scope of the specific symbol is in the file in which it is defined. You can also define symbols in the app.json file, and then the scope is global for the extension.

Note

Built-in symbols are currently not supported in AL. Symbols must be defined in a specific file or in the app.json file.

Note

User personalization and profile configuration (including profile copy) are not meant to work with directives, which means that they are ignored by the platform in the cases of #pragma, #region, #endregion and fail with an error when they are not supported for #if, #elif, #define, etc.

Conditional directives

The following conditional preprocessor directives are supported in AL.

Conditional preprocessor directive Description
#if Specifies the beginning of a conditional clause. The #endif clause ends it. Compiles the code between the directives if the specified symbol being checked is defined.

Inside the #if directive, you can use logical operators to create complex conditions. The supported logical operators are shown in the next section.
#else Specifies a compound conditional clause. If none of the preceding clauses evaluate to true, the compiler will evaluate code between #else and #endif.
#elif Combines else and if. If #elif is true the compiler evaluates all code between #elif and the next conditional directive.
#endif Specifies the end of a conditional clause that begins with #if.
#define Defines a symbol that can be used to specify conditions for a compilation. For example, #define DEBUG. The scope of the symbol is the file that it was defined in.
#undef Undefines a symbol.

Logical operators in conditional directives

The operators && (and), || (or), and ! (not) are supported in conditional directives. && (and) evaluates to true if both operands are true, || evaluates to true if one of the operands is true, and ! negates the value of the operand.

Defining preprocessorSymbols

Symbols can be defined globally in the app.json file. A symbol can also be defined using the #define directive in code, but if symbols are defined in the app.json file, they can be used globally. The following example defines DEBUG as a global symbol. This can then be used from code as illustrated in the following Conditional code example. A symbol has a boolean value that means it evaluates to true or false.

The app.json syntax is:

"preprocessorSymbols": [name [,name2]]

For example:

"preprocessorSymbols": [ "DEBUG","PROD"]

For more information, see JSON Files.

Example

#if DEBUG
    trigger OnOpenPage()
    begin
        Message('Only in debug versions');
    end;
#endif

Development in AL
AL development environment
Conditional directives
Region directive in AL
Pragma directive in AL
Deprecating explicit and implicit with statements
Best practices for deprecation of code in the Base App
ObsoleteState property
ObsoleteReason property
ObsoleteTag property
Obsolete attribute