当前位置:首页 > 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网络软件专家

  • 关注微信关注微信

猜你喜欢

热门标签

怎样打开路由器wifi 手机怎样设置取消呼叫转移功能 win10怎么更换第三方字体Windows10上更换字体的步骤 苹果手机安全锁定了怎么办 画机器人帅气霸气高难度 新iphone如何传输数据 如何把adm下载器的语言改成中文介绍 opporeno6怎么样 creo怎么查看模型参数介绍 360浏览器打开默认全屏怎么设置 校园网dns配置错误不能上网为什么学校的电脑上不到网?介绍 小米手机云空间怎么免费扩容小米8如何将手机照片转到优盘上?介绍 ppt怎么设置智能参考线ppt如何一次性画出三条横线?介绍 怎么让自己写的程序自动启动如何定时启动和关闭手机软件? oppo手机黑屏怎么重启手机 uv固化用卤素灯和汞灯哪个好如何区分紫外线杀菌灯管和UV紫外固化灯管? google街景地图是实时更新吗GoogleEarth卫星图像的覆盖面积已达多少? 华为nova3上市时间和价格 苹果手机pdf在哪里 ai两图形相交怎么剪掉多余部分ai中怎么去掉填充颜色后图形的边框线? 知乎文章阅读量排名知乎没有阅读量怎么做? word艺术字大小怎样随意拉伸word字拉长怎么调整回来?介绍 闲鱼自动收货为什么变成20天了闲鱼自动评价需要几天? 体重秤连接手机下载什么软件小米体脂称2怎么连接手机?介绍 office如何让编辑栏全部显示内容excel没有数据栏怎么设置? fontcreator字体间距如何打造本地网络购物服务平台? 安卓arraylist什么意思网站app制作如何植入聊天机器人的客服系统?介绍 苹果7手机无法卸载软件苹果手机上面安装的app删除不了怎么办?介绍 华为手机顶部通知栏出现图标华为手机顶部图标设置方法? 如何把支付宝收钱码放到桌面支付宝收钱码怎么领取?免费吗?介绍

微信公众号