16

我在 VS 2012 中遇到了最奇怪的行为(我正在用 cpp 编写)。

我在变量上单击“添加监视”,它显示“标识符未定义”。

下面是代码示例:

for (int j=0;j<32;j++)
        {
            unsigned char curValue=desc1.at<unsigned char>(0,j);
            printf("%s\n",curValue);    
        }

我不得不使用 printf 来显示 curValue 的值。哈哈。

有没有人遇到过这样的行为?

编辑:更奇怪的是这种情况发生。调试以下代码时:

    int b1[8];

    for (int k=0;k<7;k++)
        b1[k]=0;

    char q=curValue; 
    int t=0;
    while (q!=0){
        b1[t++]=q%2;
        q=q/2;
    }

调试器只是跳过 b1[k]=0 的循环;

请注意,即使在循环内部,curValue 也是未定义的。

谢谢!

4

7 回答 7

24

正如 Joachim 所说: curValue 是在循环内定义的。如果 Visual Studio 中的监视窗口将其视为未定义值,则应关闭编译器优化。

编译器优化默认为 /O2 优化速度。要关闭它:

  • 转到项目,右键单击并选择属性
  • 配置属性->C/C++->优化
  • 选择 optimization ,并将其从 Maximize Speed (/O2) 更改为 Disabled (/Od) 在此处输入图像描述
于 2014-02-03T10:54:49.737 回答
4

我打开了优化。这搞砸了我的调试。

于 2013-07-27T18:21:16.053 回答
2

如果没有 printf,第一个循环没有副作用,因此很可能在优化构建中被优化掉。在第二个示例中,将小数组初始化为 0 的循环可能会替换为已初始化的数据段。

您可能应该尝试使用未优化的构建进行调试。

另请注意,Visual Studio 调试器为标准容器提供了非常好的可视化工具。因此,如果第一个循环的全部目的只是查看 的内容desc1,您可能可以直接在调试器中检查它。

于 2013-07-27T22:45:57.757 回答
1

因为curValue超出了for循环范围。

另请注意,您应该使用%cinprintf来打印char. %s用于 C 风格的字符串。

printf("%c\n",curValue);
于 2013-07-27T17:56:58.060 回答
1

变量curValue仅在循环内有效。如果您不在循环中时尝试将其添加到“监视”中,那么您的变量将不会被定义。

注意:最好打印一下:

printf("%c\n",curValue);

而不是这个:

printf("%s\n",curValue)
于 2013-07-27T17:58:15.517 回答
1

请记住,该变量curValue仅在循环内有效,如果您在不在循环中时尝试将其添加到手表,则未定义该变量。

于 2013-07-27T17:55:18.090 回答
0

重新启动 Visual Studio。为我工作。

于 2018-12-18T19:04:13.153 回答