__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, ...);

请参见

参考

参数传递的和命名约定

C++关键字