C++ 添加监视显示未定义的标识符visual studio 2012,cpp

C++ 添加监视显示未定义的标识符visual studio 2012,cpp,c++,visual-studio,watch,C++,Visual Studio,Watch,我在VS 2012中遇到了最奇怪的行为(我在cpp中写作) 我在变量上单击“AddWatch”,它会显示“标识符未定义” 下面是一个代码示例: for (int j=0;j<32;j++) { unsigned char curValue=desc1.at<unsigned char>(0,j); printf("%s\n",curValue); } for(int j=0;j请记住,变量

我在VS 2012中遇到了最奇怪的行为(我在cpp中写作)

我在变量上单击“AddWatch”,它会显示“标识符未定义”

下面是一个代码示例:

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

for(int j=0;j请记住,变量
curValue
仅在循环内有效,如果在不在循环内的情况下尝试将其添加到手表中,则不会定义变量。

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

还请注意,您应该在
printf
中使用
%c
打印
char
%s
用于c样式字符串

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

变量
curValue
仅在循环内有效。如果在不在循环内时尝试将其添加到“watch”中,则不会定义变量

注意:最好打印以下内容:

printf("%c\n",curValue);
与此相反:

printf("%s\n",curValue)

我打开了优化。这打乱了我的调试。

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

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


还要注意的是,Visual Studio调试器对于标准容器有非常好的可视化工具。因此,如果第一个循环的全部目的只是查看
desc1
的内容,那么您可以直接在调试器中检查它。

正如Joachim所说:curValue是在循环中定义的。如果Visual Studio中的watch windowo将其视为未定义的值,然后应关闭编译器优化

编译器优化默认值为/O2优化速度。要关闭它,请执行以下操作:

  • 转到“项目”,右键单击并选择“属性”
  • 配置属性->C/C++->优化
  • 选择优化,并将其从最大速度(/O2)更改为禁用(/Od)

重新启动Visual Studio。对我有效。

谢谢你的回答,但它甚至在循环中也没有定义。@user2215359你是否打开了优化?它们会在调试时把事情搞砸。在这种情况下,如果循环中没有超过
curValue
的赋值,则很可能会被优化掉。感谢answ呃。我如何检查我是否打开了优化?感谢所有回答的人。这个问题的另一个解决方案是启用编译器的优化,但启用/Zo(增强优化调试)告诉编译器生成与优化代码一起工作的附加调试信息。这仅适用于VisualStudio 2013更新3或更高版本。请参阅此问题已经在许多版本上已经有多年的历史了。而微软的C++半实现的另一个例子已经出现了。(在C#中,你永远不会看到这样的胡说八道。)请注意,这主要用于调试配置模式,不适用于应该无bug且优化的版本。谢谢。在vs 2019中,优化已关闭,但变量仍未定义。
printf("%s\n",curValue)