2011-11-13 27 views
0

我正在写一些内联函数以获得乐趣,并且它引发了一个我从未遇到过的异常。有趣的是,如果我继续,异常之后就停止了我的程序执行流程,它将返回两个整数的总和。C++内联函数抛出异常:运行时检查失败#0 - ESP的值不正确

__declspec(dllexport) int addintegers(int one, int two) 
{ 
    int answer = 0; 
    __asm 
    { 
     mov eax, 0 
     push two 
     push one 
     call add 
     mov answer, eax 
    } 
    return answer; 

} // Debugger stops here with exception message 

异常消息:

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

// add function definition 

int add(int one, int two) 
{ 
    return one + two; 
} 
+0

其中是'add'定义? – sehe

+1

购买微软雪茄,让您摆脱困境。你需要使用add()函数__stdcall,否则你将不得不在调用两次pop之后自行清理堆栈。 –

+0

我的确有一个add的定义 –

回答

4

我不知道很多关于汇编,你不告诉我们的add()申报,但如果它坚持到C的调用约定,你必须从栈中弹出的参数调用后返回呼叫者,召集者。

要求调用者清理堆栈而不是被调用者,这就是允许C具有可变数量参数的函数的原因,如printf()

+0

谢谢我通过做pop pop one修复了代码。 –

相关问题