当前位置:首页 > TAG信息列表 > c语言函数库调用方法c语言函数调用规则?

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网络软件专家

  • 关注微信关注微信

猜你喜欢

热门标签

微信聊天图片怎么批量保存 华为手机大文件和视频是重复的吗 苹果计算器下载安装 windows10备份与还原 大屏智能手环使用说明书介绍 如何在excel中找出重复的信息 华为分屏怎么分一半 苹果个人热点在哪里 拼多多商家版如何设置免拼拼多多商家版如何关闭免密支付?介绍 一键思维导图软件ipad上有什么好用的思维导图软件?介绍 word文档中增加边框效果在哪word文档怎么设置边框中间间隔条? 积分兑换的话费能直接用么联通定向积分可以兑换话费吗?介绍 wifi断开后不能自动切换移动数据手机wifi和移动数据切换的时候就断网? 做微信公众号需要多少钱 华为手机充电中途不充电要等一会华为手机充电问题介绍 隔空投送无法共享是什么原因 淘宝dsr运营技巧淘宝dsr低于多少会限流? 手机制作广告图片软件 华为手机支付时怎么取消人脸识别华为手机怎么可以免掉王者的人脸识别? 奥维互动地图怎么自定义地图奥维互动地图怎么圈红线?介绍 怎么用wps制作柱状图ExcelWPS怎样插入簇状柱形图?介绍 cad怎样修改标注尺寸数字大小 天翼云盘怎么取消自动续费天翼网络电视怎么关掉自动续费?介绍 怎么知道自己的电脑桌面壁纸尺寸word文档背景图的长宽是多少像素? 多屏协同怎么拖文件到电脑上华为多屏协同使用教程? oppo便签下载 终端模拟器编程好后怎么打开ous系统怎么运行exe? 手机快手卖东西的流程快手开播准备页面怎么上架商品?介绍 微信公众号取名如何运营好一个微信公众号?介绍 如何把excel几行的内容合并为一起excel里如何把多行数据合并成一行?介绍

微信公众号