1

我有一个 VC++ 6.0 项目,我现在正在使用 VS2008 进行编译。我有这段代码,它曾经在 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 回答