11

正如Microsoft Dynamics AX 2009 Programming: Getting Started一书中所说,需要在 x++ 中的声明后放置分号:

只要第一行代码不是关键字,变量声明后的额外分号是强制性的。分号告诉编译器变量声明已经结束。您不能在该分号之后声明新变量。

(直接从书中复制,未更改,如果需要我会删除它)

但是,当我删除分号并运行作业时,绝对没有错误或问题:

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

就像

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

     print string1;
     pause;
}

真的需要吗?我应该习惯使用它吗?

4

4 回答 4

15

这里解释得相当优雅。

一个关键引述[强调我的]:

“你需要那个额外的分号的原因是因为编译器不能总是看到变量声明在哪里结束。如果你不帮忙,它会做出猜测。而且它不太擅长猜测。”

当编译器分析代码时,它会检查一行中的第一个单词是否与类型(AOT 对象)的名称匹配。如果它是一个类型名称,编译器将该行视为变量声明。在这种情况下,变量名应该是下一个。

于 2009-12-29T18:30:43.673 回答
9

随着 AX 2012 的发布,无需在变量声明后添加额外的分号。

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

于 2010-12-23T12:31:29.413 回答
6

如果您的代码正文不以关键字开头,则只需要分号。在您的示例中,您的代码以 开头print,这是一个内置关键字。如果您尝试使用以下代码开始代码:string1+=".COM";您将收到错误消息。

Dynamics AX 2009 是最后一个需要额外分号的 AX 版本。AX 6.0 应该解决这个问题:mfp 的两分钱:这个分号是怎么回事?

于 2009-12-29T19:19:21.533 回答
4

当声明后的下一个单词(如果有)不是编译器识别的某个关键字(如类型(EDT、表、类...... )

例如:

void method1()
{
    CustTable    custTable;

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

错误!因为编译器无法分隔 X++ 代码开头的类声明块。当编译器读取第二行时,它不知道 custTable 是一个新变量还是 X++ 代码的一部分。因此,您需要额外的分号来说明编译器在哪里结束声明(实际上,在哪里是 X++ 代码的开始)。

void method1()
{
    CustTable    custTable;

    if (custTable)
    {
        // stuff happens
    }        
}

作品!因为编译器知道你不能声明一个类型的变量if(它显然是一个保留关键字),所以很明显这是 X++ 代码的开始,你不能在这一行之后声明变量。

即使没有变量声明,也可以这样工作:

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

错误! custTable可能是一个声明,或者像那个例子一样的 X++ 代码。

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

作品!因为return不能是声明。

额外的:

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

这应该有效(因为info不是类型),不是吗?……但事实并非如此!为什么?因为info是一个特殊的内核方法,会被替换成它的全名:Global::info(),第一个token会Global在预编译器替换之后,并且Global是一个类。

于 2013-02-25T17:32:28.483 回答