gpt4 book ai didi

c++ - 编译器忽略 __stdcall

转载 作者:太空狗 更新时间:2023-10-29 20:44:59 24 4
gpt4 key购买 nike

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

这是我声明函数的方式:

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

这就是输出的样子: enter image description here
(来源:server4u.cz)

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

谢谢。

最佳答案

问题在这里:, ...)

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

__stdcall 函数必须在最后从堆栈中移除所有堆栈参数,但它们无法提前知道它们将接收多少参数作为参数。

__fastcall 函数也是如此。

参数数量可变的函数唯一适用的调用约定是 __cdecl,其中调用者必须在调用后删除堆栈参数。尽管您请求使用 __stdcall,但编译器仍会使用它。

关于c++ - 编译器忽略 __stdcall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11833893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com