__stdcall
Microsoft 专用
调用约定 __stdcall 用于调用 Win32 API 函数。 被调用方清理堆栈,因此,编译器进行 vararg 功能 __cdecl。 使用此调用约定的函数需要函数原型。
return-type __stdcall function-name[(argument-list)]
备注
下面的列表显示此调用约定的实现。
元素 |
实现 |
---|---|
参数在订单 |
从右向左。 |
传递约定 |
,通过值,除非指针或引用类型通过。 |
堆栈维护职责 |
调用函数将其从堆栈自己的参数。 |
名称修饰约定 |
下划线 (_) 前缀为名称。 该名称后跟在 (@) 后跟符号 (十进制) 在参数列表。 因此,作为 int func( int a, double b ) 声明的函数修饰如下所示: _func@12 |
大小写转换约定 |
无 |
/Gz 编译器选项为所有功能指定 __stdcall 不显式声明与不同的调用约定。
使用 __stdcall 修饰符声明函数的返回值的方法与使用 __cdecl声明的功能相同。
在 Itanium 处理器 (IPF)系列 (ipf) 和 x64 处理器, __stdcall 由编译器接受并忽略;在 IPF,按照约定,参数将传入寄存器。
对非静态类函数,因此,如果函数是定义的未包含联的,调用约定修饰符在该未包含联定义的不必指定。 即类非静态成员方法,在声明中指定的调用约定在定义假定。 将此类定义,
struct CMyClass {
void __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
与此等效
void __stdcall CMyClass::mymethod() { return; }
示例
在下面的示例中,为stdcall 的使用生成作为标准已处理的所有 WINAPI 函数类型调用:
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);