5

我正在使用 VS2010编写一个C应用程序。我有以下#define:

#define wRow   Wksp[Session.wkspIndex]->Row

“行”是一个结构数组。所以没有定义,它看起来像这样:

Wksp[Session.wkspIndex]->Row[1].value

如果没有定义,我可以将鼠标悬停在“价值”上并查看其价值。但是当我使用定义时,像这样:

wRow[1].value

然后悬停什么都不做,因为(我假设)调试器懒得做我定义的扩展。

有什么方法可以告诉调试器扩展它#define以便我可以看到它的值?Watch窗口出现同样的问题:我无法进入wRow...,但必须使用Wksp[Session.wkspIndex]->Row...

4

4 回答 4

1

所以基本上你在问如何获得这个定义的价值: 在没有定义的调试模式下悬停

同样的方式你会得到这个变量的值: 使用define在调试模式下悬停

在 Visual Studio 2010 中,您无法像获取变量值一样在调试时获取宏的值。将鼠标悬停在变量上实际上与在监视窗口中输入变量具有相同的效果,并且由于 Visual Studio 调试符号的格式,此监视窗口可以访问的信息受到限制。如果您vRow在监视窗口中输入宏,您将获得:

错误:找不到符号“vRow”

这就是为什么当您将鼠标悬停在vRow.

要使用 Visual Studio 调试宏值,可以Preprocess to a fileConfiguration Properties ->C/C++ ->Preprocessor. 然后下次编译程序时,Visual Studio 会生成一个 .i 文件,这是预处理器的输出。通过打开这个 .i 文件,您可以看到宏的实际扩展值是多少,并在调试时在监视窗口中输入此值。

于 2013-09-21T14:33:26.060 回答
1

我真的建议改用临时指针。它们与调试器一起工作得更好,并且也尊重范围。

就像是:

void myFunc(void) {
    RowType * wRow = Wksp[Session.wkspIndex]->Row;
    wRow[1].value = 0; /* or whatever */
}
于 2013-09-16T10:25:40.037 回答
0

我建议使用编译器选项来简化您的调试...

#ifdef _DEBUG

<TYPE> *wRow = Wksp[Session.wkspIndex]->Row;

#else

#define wRow Wksp[Session.wkspIndex]->Row

#endif
于 2013-09-21T13:59:11.007 回答
0

在 Linux 上只需使用 GDB 和他的扩展宏功能

在 Windows 上,我使用集成到 Visual Studio中的https://www.jetbrains.com/resharper-cpp/

配置属性 ->C/C++ ->预处理器->>YES 也可以,但它是矫枉过正的。

于 2016-10-21T11:26:39.453 回答