1

VS2008を使用してコンパイルしているVC++6.0プロジェクトがあります。私はVC++6でコンパイルするために使用されたこのコードを持っていますが、VS2008ではエラーをスローします:

int CIDStorage::Length()

{

CIDStorage* m_ptr = this;

    for(int i = 0;m_ptr->m_ptrNext != NULL;i++)
        m_ptr = m_ptr->m_ptrNext;

    if(i == 0)
        if(m_ID.IsEmpty())
            return 0;

    return i+1;
}

エラーは 'i' : undeclared identifier

それがどのようにして起こったのかがわかります。だから...私はソースコードを変更しますか?または、これを解決するために設定できるコンパイラ設定はありますか?

4

1 に答える 1

2

VC ++ 6(通常は1)は、forループで定義された変数が、そのforループが存在するスコープの残りの部分に対して定義されたままであるという先行標準ルールに従います。VC ++ 2008は、forループが新しいスコープを定義し、変数がそのスコープ内でのみ定義されるという標準ルールに従います。

治療法は非常に簡単です-ループの外側で変数を定義します:

int CIDStorage::Length()
{
    CIDStorage* m_ptr = this;
    int i;

    for(i = 0; m_ptr->m_ptrNext != NULL; i++)
        m_ptr = m_ptr->m_ptrNext;

    if(i == 0)
        if(m_ID.IsEmpty())
            return 0;

    return i+1;
}

1 VC ++のコンパイラforは、実際には、ループで定義された変数のスコープに関する正しいルールに従うことができます。残念ながら、ルールに従うには、フラグを使用する必要があります。フラグは、認識しているすべてのルールを可能な限り厳密に適用/Zaしようとします。これをオンにすると、エラーが含まれているとして、それ自体のヘッダーがすべて(事実上?)拒否されるため、完全に使用できなくなります。

于 2012-11-30T15:43:52.360 に答える