为啥在 VC++ 调试器上计算表达式时会出现“成员函数不存在”错误?

Posted

技术标签:

【中文标题】为啥在 VC++ 调试器上计算表达式时会出现“成员函数不存在”错误?【英文标题】:Why do I get a "member function not present" error when evaluating expressions on the VC++ debugger?为什么在 VC++ 调试器上计算表达式时会出现“成员函数不存在”错误? 【发布时间】:2009-06-26 22:46:40 【问题描述】:

我在另一个 DLL MyDll.dll 上有一个静态方法 MyClass::myMethod()。在我的代码中,我调用了这个方法,它编译并运行良好。

但是当我在即时窗口(或监视窗口)中尝试 MyClass::myMethod() 时,我总是得到:

MyClass::myMethod()
CXX0052: Error: member function not present

为什么会这样?

更新:我发现当我使用context operator 时它可以工作:

,,MyDLLMyClass::myMethod()

不过,我不太确定为什么需要它,所以我会稍等片刻,看看是否有人有一个很好的解释。

更新 2:我被要求提供更多信息。不幸的是,我所描述的几乎就是我所拥有的。这是在第三方代码中。该方法驻留在不同的 DLL 上,声明如下:

class MyClass

 public:
 // ...
 _declspec(dllimport) static const char *getDirectory(void);

它是这样调用的:

MyClass::getDirectory ()

我没有找到来源。它是在VC++9下的Debug模式下编译的。

【问题讨论】:

似乎监视窗口不够智能,无法找到以这种方式运行的源。你有没有试过用你自己的函数来包装这个调用 - char* foo() return MyClass::getDir(); ?它可能会以这种方式工作,因为 MyClass 的源代码将在编译时而不是运行时解析。 【参考方案1】:

好吧,我不知道为什么,但调试器不够聪明,无法知道该类在另一个 DLL 中,因此您必须使用 context operator 明确告诉它:

,,MyDLLMyClass::myMethod()

【讨论】:

为我工作(在我为模块加载 PDB 之后)。谢谢!【参考方案2】:

这可能是因为您的静态函数是内联定义的。

我对这门课的测试:

class myclass

public:
    static int inlinetest() 
     
        return 0; 
    
    static int test();
;

int myclass::test()

    return 0;

在我的即时窗口中给我这个输出:

myclass::inlinetest()
CXX0052: Error: member function not present
myclass::test()
0

【讨论】:

@fretje 它不是内联的——这个类在另一个封闭源代码的 DLL 中。我实际上已经设法让它工作(见我的更新),但我真的不知道为什么。

以上是关于为啥在 VC++ 调试器上计算表达式时会出现“成员函数不存在”错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我安装的vc6.0之后,编译程序的时候总会出现这个图标呢?

为啥VC++ 2010编译器在编译简单代码时会崩溃?

为啥在计算整数数组的最小值时会出现“实际或形式参数列表长度不同”的错误?

为啥 firebug 在调试时会改变网站的行为?

为啥在尝试获取数据分析报告时会出现 IndexError?

为啥在运行C#时会弹出找不到调试类型coreclr调试适配器描述符?