How to: Use #define and #if to Test a Macro [AX 2012]

Updated: October 5, 2009

Applies To: Microsoft Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 R2, Microsoft Dynamics AX 2012 Feature Pack, Microsoft Dynamics AX 2012

A macro is a variable known to the precompiler. The variable can have a value that is a sequence of characters, but it is not required to have a value. The #define directive tells the precompiler to create the macro variable, including an optional value. The #if directive tests whether the variable is defined, and optionally, whether it has a specific value.

The value of a macro variable can be written into the X++ code at any location, by giving the name of the macro with the # character added as a prefix.

All precompiler directives and symbols begin with the # character. All of the directives and symbols are handled and removed before the resulting X++ code is given to the X++ compiler.

In the following code sample, a macro named MyMacro is defined. It is not given a value in the #define.MyMacro definition line. Therefore it behaves as if the value is a zero-length sequence of characters.

The #if.MyMacro statement tests whether MyMacro is defined. Because MyMacro is defined, the lines of code before the first #endif are included in the X++ code at the test location.

Near the end of the X++ code there is an #ifnot.MyMacro test. Because MyMacro is defined, that test is false and no lines are written into the X++ code.

After the precompile phase ends for this job, the MyMacro definition goes out of scope and is no longer known to the system.

Cc197117.collapse_all(en-us,AX.60).gifCode Sample

static void SimpleDefineIfJob(Args _args)
{
    str sTest = "Initial value.";
    ;
    #define.MyMacro // MyMacro is now defined.

    #if.MyMacro
        sTest = "Yes, MyMacro is defined.";
        info(sTest);
    #endif

    // Notice the non-code sentence line causes no X++ compiler error,
    // because the X++ compiler never sees it.
    #ifnot.MyMacro
        The X++ compiler would reject this sentence.
        sTest = "No, MyMacro is not defined.";
        info(sTest);
    #endif

/********** Actual output
Message (03:46:20 pm)
Yes, MyMacro is defined.
**********/
}

Announcements: New book: "Inside Microsoft Dynamics AX 2012 R3" now available. Get your copy at the MS Press Store.

Community Additions

ADD
Show: