如何在没有编译器破坏堆栈的情况下使用带有__stdcall的varargs

时间:2015-01-08 03:56:45

标签: c++ c visual-c++ icc

我遇到了MSVC和ICC的问题:

我需要使用带有stdcall调用约定的varadic参数,但编译器会忽略它的varadic函数并破坏堆栈。

解决这个问题的简单方法是将参数的数量作为参数之一,并在它被损坏之前抵消ESP,但在这种情况下,我不需要这个数字对于函数上下文的args,如果可能的话,宁可避免使用它。

有人知道是否有办法吗?

1 个答案:

答案 0 :(得分:1)

根据documentation

  

被调用者清理堆栈,因此编译器生成vararg函数__cdecl

鉴于此,我不确定您的预期如何进行。如果stdcall要求被调用者清理堆栈,但是在vararg函数中,被调用者无法在编译时知道堆栈上的内容,它将如何工作?您是否希望stdarg va_list宏操纵调用框架?我并不认为微软是如何看待它的,所以你所要求的东西似乎不可能,至少不是通过使用微软编译器编写C语言。