C++ VS2010 调试器对超出循环范围的循环变量表现异常

标签 c++ visual-studio-2010 debugging

我有点困惑,因为 VS2010 中的 C++ 调试器似乎表现得有点奇怪。 如果我去运行这个:

int i = 100;

for(int i = 0; i < 5; i++)
{
    printf("Value of i inside loop: %d", i);
}

printf("Value of i outside loop: %d", i);

然后,当在上面最后一行之后的一行上设置断点并将光标悬停在“i”变量上方时,调试器将显示值 5。

但是,如果我决定将“i”变量作为参数发送给方法:

Test(100);

void Test(int i)
{
    for(int i = 0; i < 5; i++)
    {
        printf("Value of i inside loop: %d", i);
    }

    printf("Value of i outside loop: %d", i);
}

然后,当在最后一行断点并将鼠标悬停在“i”上时,调试器显示值 100。

任何人都可以告诉我这一点(或在您的机器上进行测试)。这是一个错误还是一个功能,或者我错过了什么?

提前致谢!

更新:只是为了让事情变得清楚 - 实际程序按预期打印和执行,只有调试器显示意外的值。因此,人们可以忽略它说的“printf”,它几乎可以是涉及变量“i”的任何内容。

最佳答案

这是一个错误。您要求调试器告诉您变量 i 的值。当前堆栈帧中有两个同名的变量。调试器给你错误的(超出范围)。这可能是因为局部变量调试符号不是为每个作用域生成的,而是为每个堆栈帧生成的。

不要这样做,这是一个非常糟糕的主意。它会让你感到困惑,或者即使不是你,也会让你之后的程序员感到困惑,就像它让调试器感到困惑一样。

它应该生成警告 C6244。

新项目最好指定/Wall/WX,即启用所有警告并将警告视为错误。

关于C++ VS2010 调试器对超出循环范围的循环变量表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22609781/

相关文章:

c++ - 在初始化/激活 ActiveX 控件后,如何获取该控件的 HWND?

entity-framework - Entity Framework 4 将 DateTimeOffset 映射到 Visual Studio 2010 中的 SQL 日期时间

typescript - 你如何调试 Jest 测试?

c# - 通过 XmlDocument 获取嵌套元素和值时感到困惑

c++ - 为什么此代码在 Mac 和 Red Hat 中运行如此不同

c++ - 在 OpenGL 中绘制一个简单的抗锯齿火柴人

c++ - 多个定义 : Stumped

visual-studio-2010 - Visual Studio 2010解决方案查找所有引用不起作用

c++ - max和fmax的区别(跨平台编译)

ios app-on-device 调试事件