可以stdcall有一个可变的参数?

据我所知,只有调用者清理栈约定可以使用可变参数。
顺便说一下,WinApi StringCchPrintfW是这样声明的(我删除了SAL)

__inline HRESULT __stdcall
StringCchPrintfW(
STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,
);

stdcall可以有一个可变的参数吗?

Solutions Collecting From Web of "可以stdcall有一个可变的参数?"

不。stdcall调用约定使被调用者清除堆栈。 由于被调用者正在清理堆栈,所以在编译时无法知道弹出多少,因此不能有可变参数。

为了有可变数量的函数参数,你需要使用cdecl ,调用者清理堆栈。 这是所有的编译器,以确定有多少参数被传递,因为调用者正在清理堆栈,它也知道当函数调用返回时有多少弹出堆栈。

在上面提到的情况下,函数被声明为使用__stdcall ,正如前面提到的那样不支持可变参数。 在这种情况下,编译器决定忽略定义的调用约定,并返回到__cdecl 。 这个行为在上面提到的stdcall的描述中被提到。 我引用:

被调用者清除堆栈,所以编译器使可变参数函数__cdecl

如果编译了以下代码,并且反汇编了对该函数的调用,则可以观察到这种情况。

 int __stdcall Bar(int a, int b, ...) { return b * a; } 

生成的代码将被视为__cdecl 。 至于这样定义的原因 ,我不知道。