c语言引用传递技巧 c语言函数调用规则?

c语言函数调用规则?在参数讯息传递中,有两个重要的问题需要要明确只能证明:1.当参数个数缓于一个时,听从什么顺序把参数压入内存缓冲区;2.函数调用后,由谁来把内存池恢复原状。在高级语言中,应该是实际函

c语言函数调用规则?

在参数讯息传递中,有两个重要的问题需要要明确只能证明:

1.当参数个数缓于一个时,听从什么顺序把参数压入内存缓冲区;

2.函数调用后,由谁来把内存池恢复原状。

在高级语言中,应该是实际函数的全局函数来只能证明这两个问题的。比较普遍的全局函数有:

stdcallcdeclfastcallthiscallthiscallnakedcall

下面就共有详细介绍这几种内部函数

stdcall动态链接库又被一般称Pascal动态创建。在MicrosoftC系列的C/C编译器中,使用PASCAL宏,WINAPI宏和CALLBACK宏来更改函数的动态创建为stdcall。

stdcall内部函数的函数声明为:

int_stdcallfunction(inta,int b)

stdcall的动态链接库那样的话:

(1)参数从右往左第二次压入内存池

(2)由被调用函数自己来恢复内存缓冲区

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

上面那个函数英文翻译成汇编语言将转成:

pushb先压入第二个参数

pusha再压入最先参数

callfunction调用函数

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

cdecl全局函数又称作C内部函数,是C语言缺省的动态链接库,它的语法为:

intfunction(inta,int b)//未经修饰符应该是C全局函数

int_cdeclfunction(inta,int b)//必须明确指定用C动态创建

cdecl的动态创建做出决定了:

(1)参数从右往左排列压入堆栈

(2)由动态链接库者复原内存池

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

的原因是由动态创建者来可以恢复内存缓冲区,并且C内部函数不能函数的参数个数是不固定不动的,这是C语言的一大特色。

此的函数被翻译为:

pushb//先压入第二个参数

pusha//在压入第一个参数

callfuntion//调用函数

addesp,8//需要清理逻辑块

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

fastcall遵循名字上表述就可以很清楚,它是一种迅速全局函数。此的函数的第一个和第二个DWORD参数实际ecx和edx传递,

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

被调用函数定期清理堆栈。

函数名修个规则同stdcall

其声明声明语法为:

intfastcallfunction(inta,int b)

thiscall动态创建是仅有一种没法显示重新指定的修饰符。它是c类成员函数缺省的调用。因此成员函数调用另外一个this指针,但必须用这种特殊的方法的内部函数。

thiscall动态链接库换句话说:

参数从右到左压入栈。

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

参数个数只怕的,由全局函数者清理内存映射,否则不由函数自己定期清理堆栈。

可以看见,对此参数个数固定不动的情况,它传说中的stdcall,不定时则像cdecl。

是一种都很极少见的调用,一般初级程序设计语言中不常见。

函数的声明内部函数和实际中内部函数要一致,必然会编译器会才能产生混乱。

函数名字如何修改规则:

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

__stdcall动态创建约定在控制输出函数名前而且一个下划线前缀,后面另外一个“@”符号和其参数的字节数,格式为。

__cdecl内部函数约定仅在输出低函数名前再加一个下划线前缀,格式为_function。

__fastcall动态创建约定在控制输出函数名前再加一个“@”符号,后面也一个“@”符号和其参数的字节数,格式为@。

它们均不转变输出来函数名中的字符大小写,这和PASCAL动态链接库约定完全不同,PASCAL双方约定输出的函数名无任何修饰且全部字母。

2.C程序编译时函数名稍微修饰约定规则:

__stdcall调用约定:

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

(2)函数名后面以“@@YG”标有参数表的开始,后跟参数表;

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

X--void,

D--char,

E--unsignedchar,

F--shorter,

H--int,

I--unsignedint,

J--shorter,

K--unsignedlong,

M--float,

N--slip,

_N--bool,

....

PA--意思是指针,后面的代号并且指针类型,如果没有是一样的类型的指针在不出现,以“0”不用,一个“0”代

表两次乱词;

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

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

其格式为“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,比如

intTest1(char*var1,size_tlittle)-----“?Test1@@”

voidTest2()-----“?Test2@@YGXXZ”

__cdecl调用约定:

规则同上面的_stdcall动态创建约定,只不过是参数表的开始标识由上面的“@@YG”转换成“@@YA”。

__fastcall动态链接库约定:

规则同上面的_stdcall调用约定,只不过参数表的开始标识由上面的“@@YG” “@@YI”。

VC对函数的省缺声明是#34__cedcl#34,将只能被C/C调用。

2. C语言规定:在一个源程序中,main函数的位置( )。A)必须在最开始B)必须在系统调用的库函数的后面C?

按你这选项应该是B了,,不一定得在最前,经常我的main()还在子函数的后面呢

标签: