English 中文(简体)
Is semicolon really needed after declarations in x++?
原标题:

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?

最佳回答

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.

问题回答

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.





相关问题
Benefits of declaring a function as "inline"?

Every time I read about the "inline" declaration in C it is mentioned that it is only a hint to the compiler (i.e. it does not have to obey it). Is there any benefit to adding it then, or should I ...

热门标签