Is semicolon really needed after declarations in x++?
Asked Answered
B

4

11

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?

Bronder answered 29/12, 2009 at 18:23 Comment(3)
I was about to ask the same question when I came across msdn.microsoft.com/en-us/library/cc967415.aspx. Good question!Joyance
for more information: blogs.msdn.com/b/mfp/archive/2008/04/24/…Circumambient
Your answer is right there in the definition. "mandatory as long as the first line of code is not a keyword." print is a keyword.Masera
S
15

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.

Stein answered 29/12, 2009 at 18:30 Comment(0)
F
9

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

Fart answered 23/12, 2010 at 12:31 Comment(1)
Strictly speaking, this isn't true: msdn.microsoft.com/en-us/library/cc641200.aspx "Starting in Microsoft Dynamics AX 2012 you rarely need to include a semicolon before the first statement in your X++ methods. However, you need the semi-colon in X++ methods that call static methods in the .NET Framework." More on it here: erptechnician.net/2012/06/30/… That is there are cases, however seldom they might be, when the semicolon is required even in AX 2012.Elishaelision
O
6

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?

Overwhelm answered 29/12, 2009 at 19:19 Comment(0)
L
4

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.

Laparotomy answered 25/2, 2013 at 17:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.