__stdcalll——调用约定说明符
2014-07-04 09:55
134 查看
函数调用过程中,主调函数和被调函数之间需要使用堆栈作为中间缓冲来传递参数,为保证参数传递顺序的正确性,必须对参数的入栈出栈顺序进行约定,常用的有__stdcall和__cdecl。在定义一个函数时,应该在函数名之前,返回类型之后使用调用约定说明符对这个函数所采用的调用约定进行说明。
不同开发环境的编译器都有自己的默认调用约定,如Visual C++默认的函数调用约定为__cdecl,所以调用定义为__cdecl的库函数时,可以不做任何说明。然而,Win32 API函数都遵循__stdcall调用约定,因此在默认函数调用约定为__cdecl的Visual C++开发环境中,调用Win32 AP函数必须在函数名前显式地加上__stdcall。
在Windows中,很喜欢定义别名,__stdcall被定义了许多的别名:
#define WINAPI __stdcall
#define CALLBACK __stdcall
#define CV_STDCALL __stdcall // OpenCV1.0源码中的定义
下面是OpenCV1.0源码中一个函数的定义,使用了CV_STDCALL调用约定,其中CV_STDCALL是__stdcall的别名。
参考资料
《MFC Windows应用程序设计(第3版)》p14
不同开发环境的编译器都有自己的默认调用约定,如Visual C++默认的函数调用约定为__cdecl,所以调用定义为__cdecl的库函数时,可以不做任何说明。然而,Win32 API函数都遵循__stdcall调用约定,因此在默认函数调用约定为__cdecl的Visual C++开发环境中,调用Win32 AP函数必须在函数名前显式地加上__stdcall。
在Windows中,很喜欢定义别名,__stdcall被定义了许多的别名:
#define WINAPI __stdcall
#define CALLBACK __stdcall
#define CV_STDCALL __stdcall // OpenCV1.0源码中的定义
下面是OpenCV1.0源码中一个函数的定义,使用了CV_STDCALL调用约定,其中CV_STDCALL是__stdcall的别名。
参考资料
《MFC Windows应用程序设计(第3版)》p14
相关文章推荐
- cdecl, stdcall, pascal,fastcall 调用约定区别
- cdecl, stdcall, pascal,fastcall 都有什么区别,具体是什么调用约定?
- C++常用的调用约定__cdecl &__stdcall
- cdecl、stdcall、fastcall函数调用约定区别
- dll的输出函数使用__stdcall调用约定后,客户端用GetProcAddress出现的问题!
- [C++反汇编] 调用约定 cdecl stdcall fastcall 等
- cdecl, stdcall, pascal,fastcall 调用约定区别
- _stdcall 调用约定
- cdecl, stdcall, pascal,fastcall 都有什么区别,具体是什么调用约定?
- 再议:__cdecl与__stdcall 调用约定在动态链接库调用中不同的表现
- __stdcall调用约定
- cdecl, stdcall, pascal,fastcall 调用约定区别
- VC++环境下的调用约定:_cdecl _stdcall _fastcall thiscall
- 函数调用约定 stdcall cdecl fastcall thiscall naked call
- 函数的调用约定(cdecl,stdcall,fastcall,...)
- 函数调用约定:_stdcall、_cdecl、_fastcall
- 函数调用约定:_stdcall,_cdecl,_fastcall
- __stdcall, __cdecl, __fastcall, __declspec几种调用约定及区别
- 函数调用约定,_cdecl,_stdcall
- cdecl、stdcall、fastcall函数调用约定区别