Is semicolon really needed after declarations in x++?
-
21-09-2019 - |
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?
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.
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.