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()还在子函数的后面呢