关于nginx的宏ngx_cdecl调用约定的探讨

关于宏ngx_cdecl的疑问?

1.为什么main函数前面需要加宏ngx_cdecl?

宏ngx_cdecl定义于ngx_config.h文件:

#define ngx_cdecl


- CDECL用于编译器移植,涉及函数参数出入栈的顺序,不同编译器默认值不一样的

- 显式说明使编译器在编译的时候按照统一的规则

- 变长参数只能使用cdecl的函数调用方式


函数调用约定(Calling Convention):

函数调用约定讨论:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数名修饰的方法。

__stdcall关键字:标准调用,Pascal程序缺省调用方式,通常用于Win32 Api中,函数参数从右向左入栈,被调用函数负责入栈参数的清理工作。

函数名转换格式如下:

_functionname@number


__cdecl关键字:C调用约定,C和C++程序缺省调用方式。入栈顺序是从右向左。在函数运行结束后,由调用函数负责清理入栈的参数。

在编译时,在每个函数前面加上下划线,没有函数名大小写的转换:

_functionname


__fastcall关键字:快速调用,主要特点就是快,它是通过寄存器传送参数的。在函数将要返回时,负责清理入栈的参数。

在内嵌汇编语言的时候,需要注意寄存器的使用,以免与编译器使用的产生冲突。

函数名字的转换是:

@functionname@number


thiscall:本类调用,唯一一个不能明确指明的函数修饰,thiscall不是关键字,它是C++类成员函数缺省的调用方式,this指针存放于CX寄存器。

由于成员函数调用还有一个this指针,因此必须特殊处理,入栈顺序从右向左。

如果参数个数确定,this指针通过ecx传递给被调用者;

如果参数个数不确定,this指针在所有参数压栈后被压入堆栈。

对于参数个数不定,调用者清理堆栈,否则函数自己清理堆栈。


在WIN32中,WINAPI被定义为__stdcall。使用WINAPI宏可以创建自己的APIs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值