int __stdcall stdfunc(int n,int b)
{
return n;
}typedef int (__stdcall *STD_FUNCTION)(...);STD_FUNCTION stdpf = (STD_FUNCTION)stdfunc;stdpf(10);以上代码在VS05和VS08中执行后堆栈崩溃,看了汇编,发现ESP错了以下是调用函数的汇编代码:010E1A9F  mov         esi,esp 
010E1AA1  push        0Ah  
010E1AA3  call        dword ptr [stdpf] 
010E1AA6  add         esp,4  ;为什么会出现这一句?既然是stdcall,目标函数的最后一句是ret 4,那么call完出现的add esp,4就破坏了堆栈再做以下实验:typedef int (__stdcall *INT_FUNCTION)(int);INT_FUNCTION stdpf = (INT_FUNCTION)stdfunc;stdpf(10);
此时可以正常调用何解??????????????????????难道不定参数的函数指针强制使用__cdecl调用????
gcc下又是什么情况?

解决方案 »

  1.   

    首先不定参数是cdecl特有的调用方式,stdcall是不支持的
    其次STD_FUNCTION stdpf = (STD_FUNCTION)stdfunc;,似乎stdfunc和STD_FUNCTION不兼容
      

  2.   

    __stdcall:由被调用函数平衡堆栈,函数的参数个数不能是可变的。 __cdecl:由调用者平衡堆栈,函数的参数个数可变(就像 printf 函数一样),因为只有调用者才知道它传给被调用函数几个参数,才能在调用结束时适当地调整堆栈。