__cdecl

Microsoft 专用

这是调用 C 和 C++ 程序的默认调用约定。由于调用方清理堆栈,可以执行 vararg 功能。调用约定 __cdecl 比 __stdcall,,因为它要求每创建较大的可执行文件函数调用包括堆栈清理代码。下面的列表显示此调用约定的实现。

元素

实现

参数在订单

从右到左

堆栈维护职责

调用函数将从堆栈的参数

名称修饰约定

下划线字符 (_) 前缀的名称,但,在导出使用 C 链接的 __cdecl 功能。

大小写转换约定

不执行的大小写转换

说明说明

有关相关信息,请参见 修饰名

在 Itanium 处理器 (IPF)系列 (ipf) 和 x64 处理器, __cdecl 由编译器接受并忽略;在 IPF,按照约定,参数将传入寄存器。

在变量或函数名之前放置cdecl 修饰符。由于命名和调用约定名称的 C 是默认值,那么,当您需要使用之时cdecl 是指定了 /Gz (stdcall) 或 /Gr (fastcall) 编译器选项。/Gd 编译器选项强制调用约定 __cdecl 。

对非静态类函数,因此,如果函数是定义的未包含联的,调用约定修饰符在该未包含联定义的不必指定。即类非静态成员方法,在声明中指定的调用约定在定义假定。将此类定义,

struct CMyClass {
   void __cdecl mymethod();
};

this

void CMyClass::mymethod() { return; }

与此等效

void __cdecl CMyClass::mymethod() { return; }

示例

在下面的示例中,编译器将指示使用命名的 C,并调用 system 约定请函数:

// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

请参见

参考

参数传递的和命名约定

C++关键字