编译器忽略__stdcall

时间:2012-08-06 18:34:32

标签: c++ visual-c++ calling-convention

在我看来,MSVS忽略了我的函数的__stdcall指令。我正在手动清理堆栈,但编译器仍会在每个ADD ESP之后附加CALL条指令。

这是我声明函数的方式:

extern "C" void * __stdcall core_call(int addr, ...);
#define function(...) (DWORD WINAPI) core_call(12345, __VA_ARGS__)
return function("Hello", 789);

这就是输出的样子: http://vs712.server4u.cz/msvs.png

我用箭头标记了多余的ADD指令,MSVS会在每次调用后自动追加,尽管事实上,清理堆栈是被调用者的责任(参考:http://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions),这会导致我的程序崩溃了。如果我用ADD手动替换NOPs指令,程序将按预期工作。所以,我的问题是......有没有办法强制编译器停止添加这些指令?

感谢。

1 个答案:

答案 0 :(得分:5)

问题在于:, ...)

具有可变数量参数的函数不能是__stdcall

__stdcall函数必须在最后从堆栈中删除所有堆栈参数,但他们无法事先知道它们将作为参数接收多少内容。

__fastcall函数同样适用。

具有可变参数个数的函数的唯一适用调用约定是__cdecl,其中调用者必须在调用后删除堆栈参数。尽管您要求使用__stdcall,但这就是编译器使用的内容。