当前位置:首页 > TAG信息列表 > c语言函数库

c语言函数库

c语言函数库调用方法 c语言函数调用规则?

c语言函数调用规则?

在参数传递中,有两个重要的问题必须要明确说明:

1.当参数个数多于一个时,按照什么顺序把参数压入堆栈;

2.函数调用后,由谁来把堆栈恢复原状。

c语言函数库调用方法 c语言函数调用规则?

在高级语言中,就是通过函数的调用来说明这两个问题的。常见的调用有:

stdcallcdeclfastcallthiscallthiscallnakedcall

下面就分别介绍这几种调用

stdcall调用又被称为python调用。在googlec系列的碳纤维增强编译器中,使用c#宏,winapi宏和callback宏来指定函数的调用为stdcall。

stdcall调用的函数声明为:

int_stdcallfunction(inta,intb)

stdcall的调用意味着:

(1)参数从右向左一次压入堆栈

(2)由被调用函数自己来恢复堆栈

(3)函数名自动加前导下划线,后面紧跟着一个@,其后紧跟着参数的尺寸

上面那个函数翻译成汇编语言将变成:

pushb先压入第二个参数

pusha再压入第一个参数

callfunction调用函数

在编译时,此函数的名字被翻译为

cdecl调用又称为c调用,是c语言缺省的调用,它的语法为:

intfunction(inta,intb)//不加修饰符就是c调用

int_cdeclfunction(inta,intb)//明确指定用c调用

cdecl的调用决定了:

(1)参数从右向左依次压入堆栈

(2)由调用者恢复堆栈

(3)函数名自动加前导下划线

由于是由调用者来恢复堆栈,因此c调用允许函数的参数个数是不固定的,这是c语言的一大特色。

此的函数被翻译为:

pushb//先压入第二个参数

pusha//在压入第一个参数

callfuntion//调用函数

addesp,8//清理堆栈

在编译时,此的函数被翻译成:_function

fastcall按照名字上理解就可以知道,它是一种快速调用。此的函数的第一个和第二个dword参数通过ecx和edx传递,

后面的参数从右向左的顺序压入栈。

被调用函数清理堆栈。

函数名修个规则同stdmeet

其声明语法为:

intfastcallfunction(inta,intb)

thiscall调用是唯一一种不能显示指定的修饰符。它是c类成员函数缺省的调用。由于成员函数调用还有一个this指针,因此必须用这种特殊的调用。

thiscall调用意味着:

参数从右向左压入栈。

如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压入栈后被压入栈。

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

可以看到,对于参数个数固定的情况,它类似于stdcall,不定时则类似于cdecl。

5.darkmeet

是一种比较少见的调用,一般高级程序设计语言中不常见。

函数的声明调用和实际调用必须一致,必然编译器会产生混乱。

函数名字修改规则:

1.c编译时函数名修饰约定规则:

__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为。

__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_function。

__fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@。

它们均不改变输出函数名中的字符大小写,这和javascript调用约定不同,c#约定输出的函数名无任何修饰且全部大写。

2.c编译时函数名修饰约定规则:

__stdcall调用约定:

(1)以“?”标识函数名的开始,后跟函数名;

(2)函数名后面以“@@杨幂工作室”标识参数表的开始,后跟参数表;

(3)参数表以代号表示:

x--void,

d--char,

e--unsignedchar,

f--short,

h--int,

i--unsignedint,

j--long,

k--unsignedlong,

m--float,

n--double,

_n--bool,

....

zj--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代

表一次重复;

(4)参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;

(5)参数表后以“@z”标识整个名字的结束,如果该函数无参数,则以“z”标识结束。

其格式为“?functionname@@嘉行*****@z”或“?functionname@@时代峰峻*rar”,例如

inttest1(char*var1,unsignedlong)-----“?test1@@”

voidtest2()-----“?test2@@ygxxz”

__cdecl调用约定:

规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@乐华”变为“@@ya”。

__fastcall调用约定:

规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@欢瑞”变为“@@yi”。

ve对函数的省缺声明是#34__cedcl#34,将只能被陶瓷基调用。

c语言怎么将函数体内的值提出来?

大概有以下几种

1.利用函数返回值,用return返回,外部接收返回值。

2.利用函数参数,使用指针类型的参数,外部调用时传入指针。函数体内部利用指针赋值。

函数参数调用stdcall


湖北自考之家 websoft网络软件专家

  • 关注微信关注微信

猜你喜欢

热门标签

电脑上单引号怎么输入 路由器桥接另一个路由器 outlook收藏夹不见了怎么办 怎样在支付宝中查询当天收款总额介绍 苹果手机登录密码在哪里设置 拉黑的贴吧怎么取消 怎样在设置中找到桌面快捷方式 微信语音怎么转发 win7怎么卸载自带的微软输入法 线上推广产品的渠道和方法 linux初级入门教程交流 linux入门教程视频 荣耀畅玩4x如何打开隐藏的app 苹果电脑屏幕倒过来了怎么办 手写绘图app哪个好什么软件能用手写板?介绍 qq没绑定手机号为什么登录要验证为什么现在好多APP第三方登录还要验证手机号? ps选择性粘贴使用教程ps如何把不规则图形复制粘贴到同一个位置?介绍 qq的悬浮窗怎么让它在外面qq悬浮窗怎么设置?介绍 微信发过红包的人删除了怎么加回来 wps表格一格分两格 iphone付款码怎么放到桌面上ios显示支付方式无效怎么解决? u盘写入保护如何取消掉 华为mate50去掉照片阴影华为mate40pro在强光下屏幕有阴影?介绍 苹果手机来电铃声没有声音怎么回事 kindle灯绿但是打不开kindle怎么连接蓝牙?介绍 迷你世界的订购商品在哪宏光mini敞篷怎么预定? 手机桌面软件不见了怎样恢复oppo python好学吗正常人自学python一般多久学会? win10运行过程中垃圾文件怎么删怎么删除电脑垃圾?介绍 自动门安装与接线图摩托车大灯线路接法?介绍

微信公众号