关于宏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