我为什么要__stdcall?

时间:2009-10-15 15:46:21

标签: c++

我开始做一些directX编程。我正在使用我从互联网上找到的这个教程。

我只是想知道为什么CALLBACK被定义为_stdcall以及为什么WINAPI也是如此。

我认为在导出将被编译为dll的函数时会使用__stdcall。

但是,由于WindowProc和WINAPI永远不会被导出,为什么这些函数被声明为__stdcall?

非常感谢任何建议,

// WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, 
                            UINT message, 
                            WPARAM wParam, 
                            LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{

}

3 个答案:

答案 0 :(得分:8)

__ stdcall是指调用约定,并不一定与导出函数有关。如果您想了解更多信息,请查看维基百科关于calling conventions的文章。简而言之,编译器需要知道将参数传递到函数,堆栈或寄存器等的位置。

答案 1 :(得分:6)

__stdcall也有助于减少X86架构上的代码大小。而不是每个调用实例恢复堆栈,堆栈在返回之前仅在函数结束时恢复一次。

从DLL导出也可以是__cdecl,只要它以这种方式声明即可。例如:wsprintf()未导出为WINAPI

答案 2 :(得分:4)

想一想。从DLL导出的函数必须具有固定的已知调用约定,以便dll的用户可以调用它们。同样,使用WindowProc,它必须具有已知的调用约定,以便Windows可以调用它。 WinMain也一样。它在启动程序时必须可由OS调用。 :)