【问题标题】:Using #define in VS debugger: any way to hover and see values?在 VS 调试器中使用#define:任何悬停和查看值的方法?
【发布时间】:2013-09-11 22:06:41
【问题描述】:

我正在使用 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...

【问题讨论】:

标签: c visual-studio-2010 debugging c-preprocessor


【解决方案1】:

所以基本上你是在问如何获得这个定义的价值:

获取此变量值的方法相同:

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

错误:找不到符号“vRow”

这就是为什么当您将鼠标悬停在 vRow 上时没有显示任何内容。

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

【讨论】:

  • 请注意,Preprocess to a file 选项会阻止生成目标文件,因此您不能只打开它。见msdn.microsoft.com/en-us/library/8z9z0bx6.aspx
  • @RichieHindle 我知道,但我不知道在 Visual Studio 中同时生成预处理文件和目标文件的任何选项。
【解决方案2】:

我真的建议改用临时指针。他们工作得更好 调试器,也尊重范围。

类似:

void myFunc(void) {
    RowType * wRow = Wksp[Session.wkspIndex]->Row;
    wRow[1].value = 0; /* or whatever */
}

【讨论】:

  • 使用#define,wRow 的值随着Session.wkspIndex 的值的变化而变化。使用您的变量,它不会。
  • @RichieHindle 如果Session.wkspIndex 可以更改,那就更有理由使用刷新的指针。使用预处理器会使代码难以跟踪,因为索引更改隐藏在宏后面。预处理器有一些用途,但不是这样。
【解决方案3】:

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

#ifdef _DEBUG

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

#else

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

#endif

【讨论】:

  • 您的两个选择不一样 - 对于#definewRow 的值随着Session.wkspIndex 的值的变化而变化。使用普通变量,它不会。
【解决方案4】:

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

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

Configuration Properties ->C/C++ ->Preprocessor->>YES 也可以,但是有点过头了。

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 2016-03-21
    • 2019-03-05
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多