11

『 Microsoft Dynamics AX 2009 プログラミング: 入門』という本で述べられているように、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の2セント:このセミコロンはどうしたのですか?

于 2009-12-29T19:19:21.533 に答える
4

宣言の後の次の単語(存在する場合)が、型(EDT、テーブル、クラス、... )。

例えば:

void method1()
{
    CustTable    custTable;

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

エラー!コンパイラはX++コードの先頭のクラス宣言ブロックを分離できないためです。コンパイラが2行目を読み取るとき、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()、最初のトークンはGlobalプリコンパイラの置き換えの後にGlobalあり、クラスです。

于 2013-02-25T17:32:28.483 に答える