【问题标题】:Visual Studio expression containing a term named "by" cannot be evaluated in the watch window无法在监视窗口中评估包含名为“by”的术语的 Visual Studio 表达式
【发布时间】:2011-06-06 16:02:39
【问题描述】:

考虑下面我的 C++ 代码:

int _tmain(int argc, _TCHAR* argv[])
{
    int by = 10;
    printf("%d\n", by);

    int bx = 20;
    printf("%d\n", (by + bx));

    return 0;
}

效果很好。有趣的是“by”变量。如果我尝试为包含 by 的简单表达式添加监视,结果将是 CXX0030:错误:无法评估表达式。

例如,在return 0 的断点上,如果我添加以下手表,我会得到提到的结果:

by : 10
bx : 20
by + 5 : CXX0030: Error: expression cannot be evaluated
bx + 5 : 25
by + bx : CXX0030: Error: expression cannot be evaluated
(by) + bx : 30
by + (bx) : CXX0030: Error: expression cannot be evaluated
bx + (by) : CXX0014: Error: missing operrand

这发生在VS2010、VS2008上的多台计算机上。

那么,出于好奇,“by”是怎么回事?它是某种奇怪的运算符吗?为什么 bx 没有得到同样的待遇?

(我已经在这方面尝试过 google,但很难用“by”之类的术语获得一些相关的点击)

【问题讨论】:

  • 提交错误报告,我这里也有
  • 啊,我希望这是某种隐藏功能 :D,而不仅仅是一个普通的错误。
  • “缺失操作数”这一点尤其令人瞠目结舌。
  • Parna,你的愿望已经实现 :-) 请参阅下面的友好讨论。

标签: c++ watch visual-studio-debugging


【解决方案1】:

对此很感兴趣,我做了一些挖掘工作。从this link,我们看到调试器中的原生C/C++ 表达式求值器处理Assembly-Language 表达式;在Assembly-language link 之后,我们发现 BY 在汇编语言表达式中是 BYTE 的缩写。所以只是另一个微软的公鸡

【讨论】:

  • 回滚编辑并删除了 cmets,因此两者之间没有不连续性。享受徽章吧! :)
  • @Bill the Lizard:希望你不介意我骂你是个无聊的老屁。
  • @TonyK:当然,他们很活泼,但他们都是关于你选择的词,而不是关于这里提出/回答的问题。此类干扰(尤其是充满脏话的干扰)通常会被清除。
  • @TonyK:我从不戴。不过,我确实是从工作中登录的,而且我工作的地方正是那种如果网站被认为太“不专业”就会阻止网站的地方。我不想被屏蔽,所以我尽我所能保持 SO 的气氛尽可能专业。希望你能理解。
  • @TonyK:不,我不会被解雇,该网站会被防火墙阻止。您想看看其他一些版主工具的实际应用吗?
【解决方案2】:

您在这里看到的是 C++ Expression Evaluator 对 BY 运算符的实现。您对表达式 BY 的使用被解释为运算符而不是局部变量。

参考:http://msdn.microsoft.com/en-us/library/56638b75.aspx

关于这种行为是错误还是设计使然,已经进行了很多讨论。不幸的是,这只能由实现该功能的人真正回答。尽管对于这种情况令人不满意,但明确地这样做可能有正当的理由(想到消除歧义的成本)。或者这可能只是实施者的疏忽。同样只有他们知道答案。

如果这对您来说确实是一个错误,那么请在连接时提交一个错误。这是听取您意见的最佳方式,并且团队很可能从未收到过有关此行为的任何反馈(在我的搜索中找不到任何反馈)。

【讨论】:

  • "此行为是设计使然。"正如我在其他地方所说的那样,这只是微软的另一个骗局。多么愚蠢的设计决定!
  • @TonyK 以无法调试非常具体命名的变量为代价启用一整套调试器功能......我称之为胜利。是的,他们本可以做更多的事情来缓解这种情况,但考虑到围绕它的工作极其容易,它仍然是一个胜利。
  • 解决方法?什么解决方法?解决方法是要求汇编语言表达式前面有一个特殊字符。 '@', 例如。那是垫片吗?我不熟悉这个词。
  • 顺便问一下,您的“极其简单”的解决方法是什么?您是否建议程序员重命名他们的变量,以便他们可以在您的调试器中检查它们?如果是这样,这个奇怪的要求是否有明显的记录?
  • 重复两次变通方法不会使您的论点更强大,只会更长。是的,解决方法是将变量重命名为不与表达式评估器识别的运算符冲突。
【解决方案3】:

你遇到的是调试器的'memory operator'

在原生 C++ 中,调试器表达式可以 支持以下附加 运营商:

  • 用于指定符号上下文的上下文运算符 ({ })。 有关详细信息,请参阅上下文运算符(C/C++ 语言 表达式)。

  • 用于访问内存的内存操作符(BY、WO 和 DW)。内存运算符 具有最低的优先级 操作员。内存运算符是 主要用于调试 汇编语言代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2016-09-20
    相关资源
    最近更新 更多