C/C++中的函数调用约定
风行水上 @
C/C++中有一些修饰关键字,用来指导编译器生成代码。
这些修饰关键字会影响:
- 参数传递顺序
- 调用堆栈由谁(调用函数或被调用函数)清理
修饰符 | 压栈顺序 | 清栈 | C修饰名 | C++修饰名 |
---|
__stdcall | 从右到左 | 自己 | _funcname@nbyes | ?funcname@@YG参数表(@Z或XZ) |
---|
__cdecl | 从右到左 | 调用者 | _funcname | ?funcname@@YA参数表(@Z或XZ) |
---|
__fastcall | 从右到左 | 自己 | @funcname@nbytes | ?funcname@@YI参数表(@Z或XZ) |
---|
thiscall | 从右到左 | | | |
---|
naked call | | | | |
---|
参数表的格式如下:
- X--void ,
- D--char,
- E--unsigned char,
- F--short,
- H--int,
- I--unsigned int,
- J--long,
- K--unsigned long,
- M--float,
- N--double,
- _N--bool,
- ...
- PA--表示指针,连续出现的指针可以用'0'代替。比如,char ** 可以表示为 PA0D
- 参数表第一项是返回值的类型
据说:
- 在WIN32中,WINAPI 被定义为__stdcall
关于dll的创建
- __declspec(dllexport)
- __declspec(dllimport)