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