相关疑难解决方法(0)

奇怪的MSC 8.0错误:"在函数调用中没有正确保存ESP的值......"

我们最近试图将一些Visual Studio项目拆分成库,一切似乎都在一个测试项目中编译和构建,其中一个库项目作为依赖项.但是,尝试运行该应用程序给了我们以下令人讨厌的运行时错误消息:

运行时检查失败#0 - ESP的值未在函数调用中正确保存.这通常是调用使用不同调用约定声明的函数指针的结果.

我们甚至从未为函数指定调用约定(__cdecl等),使所有编译器开关都处于默认状态.我检查过,项目设置与整个库和测试项目的调用约定是一致的.

更新:我们的一个开发人员将"基本运行时检查"项目设置从"两者(/ RTC1,等同于/ RTCsu)"更改为"默认",运行时间消失,使程序运行正常.我完全不相信这一点.这是一个合适的解决方案,还是一个危险的黑客?

c++ x86 stack calling-convention visual-c++

48
推荐指数
6
解决办法
6万
查看次数

在特定对象实例上调用C++函数指针

我有一个函数指针定义:

typedef void (*EventFunction)(int nEvent);
Run Code Online (Sandbox Code Playgroud)

有没有办法用特定的C++对象实例处理该函数?

class A
{
private:
    EventFunction handler;

public:
    void SetEvent(EventFunction func) { handler = func; }

    void EventOne() { handler(1); }
};

class B
{
private:
    A a;
public:
    B() { a.SetEvent(EventFromA); }  // What do I do here?

    void EventFromA(int nEvent) { // do stuff }
};
Run Code Online (Sandbox Code Playgroud)

编辑: Orion指出了Boost提供的选项,例如:

boost::function<int (int)> f;
X x;
f = std::bind1st(
      std::mem_fun(&X::foo), &x);
f(5); // Call x.foo(5)
Run Code Online (Sandbox Code Playgroud)

不幸的是Boost对我来说不是一个选择.是否有某种"currying"函数可以用C++编写,它会将指向成员函数的指针包装到普通函数指针中?

c++ pointers function

13
推荐指数
4
解决办法
3万
查看次数

标签 统计

c++ ×2

calling-convention ×1

function ×1

pointers ×1

stack ×1

visual-c++ ×1

x86 ×1