__stdcall
__stdcall
调用约定用于调用 Win32 API 函数。 被调用方将清理堆栈,以便让编译器生成 vararg
函数 __cdecl
。 使用此调用约定的函数需要一个函数原型。 __stdcall
修饰符是 Microsoft 专用的。
语法
return-type
__stdcall
function-name[(
argument-list)
]
注解
以下列表显示此调用约定的实现。
元素 | 实现 |
---|---|
参数传递顺序 | 从右到左。 |
参数传递约定 | 按值,除非传递指针或引用类型。 |
堆栈维护职责 | 调用的函数从堆栈中弹出自己的参数。 |
名称修饰约定 | 下划线 (_ ) 是名称的前缀。 名称后跟后面是自变量列表中的字节数(采用十进制)的符号 (@ )。 因此,声明为 int func( int a, double b ) 的函数按如下所示进行修饰:_func@12 |
大小写转换约定 | 无 |
/Gz 编译器选项为未使用不同调用约定显式声明的所有函数指定 __stdcall
。
为了与以前的版本兼容,除非指定了编译器选项 /Za
(禁用语言扩展),否则 _stdcall
是 __stdcall
的同义词。
使用 __stdcall
修饰符声明的函数返回值的方式与使用 __cdecl
声明的函数相同。
在 ARM 和 x64 处理器上,__stdcall
由编译器接受和忽略;在 ARM 和 x64 体系结构上,按照约定,自变量将传入寄存器(如果可能)且后续自变量将在堆栈上传递。
对于非静态类函数,如果函数是超行定义的,则调用约定修饰符不必在超行定义中指定。 也就是说,对于类非静态成员方法,在定义时假定声明期间指定的调用约定。 给定此类定义,
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, ...);