我正在使用VS2010编写 C 应用。我有以下#define:
#define wRow Wksp[Session.wkspIndex]->Row
“行”是一组结构。所以没有定义,它看起来像这样:
Wksp[Session.wkspIndex]->Row[1].value
没有定义,我可以将鼠标悬停在“值”上并查看其值。 但是当我使用define时,就像这样:
wRow[1].value
然后悬停什么也没做,因为(我假设)调试器太懒了,无法进行我定义的扩展。
有没有办法告诉调试器扩展#define
所以我可以看到它的值? Watch窗口中也会出现同样的问题:我无法输入wRow...
,但必须使用Wksp[Session.wkspIndex]->Row...
。
答案 0 :(得分:1)
我真的建议使用临时指针代替。他们的工作效果更好 调试器,也尊重范围。
类似的东西:
void myFunc(void) {
RowType * wRow = Wksp[Session.wkspIndex]->Row;
wRow[1].value = 0; /* or whatever */
}
答案 1 :(得分:1)
所以基本上你问的是如何获得这个定义的值:
与获取此变量的值的方式相同:
在Visual Studio 2010中,您无法像获取变量值那样在调试时获取宏的值。将鼠标悬停在变量上实际上与在监视窗口中输入变量具有相同的效果,并且由于Visual Studio调试符号的格式,此监视窗口受限于它可以访问的信息。如果您在观察窗口中输入宏vRow
,您将获得:
错误:未找到符号“vRow”
这就是当您将鼠标悬停在vRow
上时未显示任何内容的原因。
要使用Visual Studio调试宏值,可以在Preprocess to a file
中将Configuration Properties ->C/C++ ->Preprocessor
设置为yes。然后,下次编译程序时,Visual Studio将生成.i文件,该文件是预处理器的输出。通过打开此.i文件,您可以查看宏的实际扩展值,并在调试时在监视窗口中输入此值。
答案 2 :(得分:0)
我建议使用编译器选项来简化调试...
#ifdef _DEBUG
<TYPE> *wRow = Wksp[Session.wkspIndex]->Row;
#else
#define wRow Wksp[Session.wkspIndex]->Row
#endif
答案 3 :(得分:0)
在Linux上只需使用GDB及其扩展宏功能
在Windows上,我使用https://www.jetbrains.com/resharper-cpp/集成到Visual Studio
中配置属性 - &gt; C / C ++ - &gt;预处理器 - &gt;&gt; YES也可以使用但是过度使用。