Question

As said in the book Microsoft Dynamics AX 2009 Programming: Getting Started it´s needed to put semicolons after declarations in x++:

The extra semicolon after the variable declaration is mandatory as long as the first line of code is not a keyword. The semicolon tells the compiler that variable declarations have come to an end. You cannot declare new variables after this semicolon.

(copied directly from the book, unchanged, if needed I'll remove it)

However, when I remove the semicolon and run the job, there's absolutely no error or problem:

static void Job1(Args _args)
{
    str string1 = "STACKOVERFLOW";
    ;
    print string1;
    pause;
}

works just as

static void Job2(Args _args)
{
     str string1 = "STACKOVERFLOW";

     print string1;
     pause;
}

Is it really needed? Should I get used to using it?

Was it helpful?

Solution

It's explained rather elegantly here.

A key quote [emphasis mine]:

"The reason you need that extra semicolon is because the compiler can’t always see where the variable declarations end. If you don’t help a little, it will make a guess. And it’s not very good at guessing."

While the compiler is analyzing the code it checks if the first word on a line matches the name of a type (AOT object). If it’s a type name the compiler treats the line as a variable declaration. In this case a variable name should be next.

OTHER TIPS

With the release of AX 2012 there is no need to put the additional semicolon after variable declaration.

http://msdn.microsoft.com/en-us/library/aa636895.aspx

You only need the semicolon if the body of your code doesn't start with a keyword. In your example, your code starts with print, which is a built in keyword. If you had tried to start you code with: string1+=".COM"; you would receive an error.

Dynamics AX 2009 is the last version of AX that will require the extra semicolon. AX 6.0 should fix this: mfp's two cents: What's up with this semicolon?

You really don't need the lovely semicolon (you don't get a compilation error) when the next word after declarations (if any) is not some keyword recognized by compilator like a type (an EDT, table, class, ...)

For example:

void method1()
{
    CustTable    custTable;

    custTable = CustTable::find("cust");
}

ERROR! as compiler can't separate the class declaration block of the start of the X++ code. When compilator reads the second line it doesn't know if custTable is a new variable or is part of the X++ code. So that, you need the extra semicolon to say the compiler where is the end of declarations (really, where is the start of X++ code).

void method1()
{
    CustTable    custTable;

    if (custTable)
    {
        // stuff happens
    }        
}

WORKS! as compiler knows that you can't declare a variable of type if (it's a reserved keyword, obviously) so it's clear that this is the beginning of X++ code and you can't declare variables after this line.

This works that way even if there is no variable declarations:

CustTable method1()
{
    custTable = CustTable::find("cust"); // custTable may exists in the context
    return custTable;
}

ERROR! custTable may be a decaration, or X++ code like that example.

CustTable method1()
{
    return CustTable::find("cust");
}

WORKS! as return can't be a declaration.

EXTRA:

void method1()
{
    info("This should work, ya?");
}

This should work (as info is not a type), isn't it? ... but it doesn't! Why? Because info is an special kernel method that will be replaced to its full name: Global::info(), first token will be Global after the precompiler replacement, and Global is a class.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top