盈拓台一火花机伺服错误误是为什么

一.函数修饰符:
函数名字修饰()
数的名字修饰()就是编译器在编译期间创建的一个字符串,用来指
明函数的定义或原型。程序或其他工具有时需要指定函数的
名字修饰来定位函数的正确位置。多数情况下程序员并不需要知道函数的名字修饰,程序或
其他工具会自动区分他们。当然,在某些情况下需要指定函数的名字修饰,例如在程序中,
为了让程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的
函数(如构造函数和析构函数)指定名字装饰。另一种需要指定函数的名字修饰的情况是在汇编程序中调用或的
函数。如果函数名字,调用约定,返回值类型或函数参数有任何改变,原来的名字修饰就不再有效,必须指定新的名字修饰。和程
序的函数在内部使用不同的名字修饰方式,下面将分别介绍这两种方式。按
从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于函数或者变量,修饰名是在函数名前
加下划线。对于函数,有所不同。如
函数的修饰名是;
对于不属于一个类的全局函数,修饰名是。这
是缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定
的参数,如函数。2._stdcall &按从右至
左的顺序压参数入栈,由被调用者把参数弹出栈。对于函数或者变量,修饰名以下划线为前
缀,然后是函数名,然后是符号及参数的字节数,如函数的修饰名是。
对于函数,则有所不同。所
有的函数都遵循该约定。3._fastcall &头两
个类型或者占更少字节的参数被放入和寄
存器,其他剩下的参数按从右到左的顺序压入栈。由被调用者把参数弹出栈,对于函数或者
变量,修饰名以为前缀,然后是函数名,接着是符号及
参数的字节数,如函数的
修饰名是。对于函
数,有所不同。未来的编译器可能使用不同的寄存器来存放参数。4.thiscall &仅仅应
用于成员函数。指
针存放于寄存器,参数从右到左压栈。不
是关键词,因此不能被程序员指定。5.naked
& call &采用的
调用约定时,如果必要的话,进入函数时编译器会产生代码来保存,,,寄
存器,退出函数时则产生代码恢复这些寄存器的内容。不产生这样的代
码。naked & call不
是类型修饰符,故必须和共同使用,如下:__declspec( & naked & ) & int & func( &
formal_parameters & ) &{ &// & Function & body &}
&?xml:namespace
prefix = o ns = "urn:schemas-microsoft-com:office:office" /&
二.函数调用
千万要注意,不
支持默认参数
注释:默认参数:比如说下面的函数
是指定的默认实参,通常在函数原型中指定。这里给了作为默认参数。用平常的时候调用这个函数那
么就是。如果这样调用那
么就是,这里没
有指定,因为是默认实参,已经有了默认值,这里就
是采用默认值。
为什么默认实参必须是函数参数表中
最右边的参数。把上面的函数改下
这样调用,
这样就是,而根
本就没有赋到值,就出错了。这些参数都是一一对应的。
持可变参数个数的函数定义,这一点与语言函数参数调用时入栈顺序有
关,首先引用其他网友的一段文字,来描述函数调用,及参数入栈:支持可变参数的函数,
这里的意思是支持函数带有可变数量的参数,最常见的例子就是
我们十分熟悉的系列函数。我们还知道在函数调用
时参数是自右向左压栈的。如果可变参数函数的一般形式是:那么参数进栈(以及出栈)的顺序是:&&& push p3&&& push p2&&& push p1&&& call f&&& pop p1&&& pop p2&&& pop p3&&& &我可以得到这样一个结论:如果支持可变参数的函数,那么参数进栈的顺序几乎必然是自右向左
的。并且,参数出栈也不能由函数自己完成,而应该由调用者完成。
这个结论的后半部分是不难理解的,
因为函数自身不知道调用者传入了多少参数,但是调用者知道,所以调用者应该负责将所有参数
在可变参数函数的一般形式中,左边
是已经确定的参数,右边省略号代表未知参数部分。对于已经确定的参数,它在栈上的位置也必须是确定的。否则意味着已经确定的参数是
不能定位和找到的,这样是无法保证函数正确执行的。衡量参数在栈上的位置,就是离开确切的
函数调用点()有多远。已经确定的参数,它在栈上的位置,不应该依
赖参数的具体数量,因为参数的数量是未知的!
所以,选择只能是,已经确定的参
数,离开函数调用点有确定的距离(较近)。满足这个条件,只有参数入栈遵从自右向左规则。
也就是说,左边确定的参数后入栈,离函数调用点有确定的距离(最左边的参数最后入栈,离函
数调用点最近)。
这样,当函数开始执行后,它能找到
所有已经确定的参数。根据函数自己的逻辑,它负责寻找和解释后面可变的参数(在离开调用点
较远的地方),通常这依赖于已经确定的参数的值(典型的如函
数的格式解释,遗憾的是这样的方式具有脆弱性)。
参数是自左向右压栈的,与的相反。对于这
种只支持固定参数函数的语言,它没有可变参数带来的问题。因此,它选择哪种参数进栈方式都
是可以的。甚至,其参数出栈是由函数自己完成的,而不是调用者,因为函数的参数的类型和数
量是完全已知的。这种方式比采用的
方式的效率更好,因为占用更少的代码量(在中,函
数每次调用的地方,都生成了参数出栈代码)。
了兼容,所以仍然支持函数带有可变的参数。但是在中
更好的选择常常是函数重载。
阅读(...) 评论()
I Love Lina~博客访问: 62273
博文数量: 83
博客积分: 0
博客等级: 民兵
技术积分: 824
注册时间:
只有今天的埋头,才有明天的出头。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
活动记录是函数调用时用于记录一系列相关信息的记录,包括:
临时变量域:用于存放临时变量的值。
局部变量域:用来存放函数本次执行中的局部变量。
机器状态域:用来保存调用函数之前机器状态的信息,包括各种寄存器的当前值和返回地址。
实参数域:用于存放函数得实参信息。
返回值域:为调用者函数存放返回值。
活动记录中保存了函数调用以及返回所需要的一切信息。
函数参数计算顺序由编译器决定,函数参数入栈顺序如何决定——调用约定
当一个函数被调用时,参数会传递给被调用的函数,而返回值会被返回给调用函数。函数得调用约
定就是描述参数怎么传递到栈空间的,以及栈空间由谁维护。
参数传递顺序:
从右到左依次入栈:__stdcall, __cdecl,__thiscal
从左到右依次入栈:__pascall, __fastcall
调用堆栈清理:
调用者清除栈。
被调用函数返回后清除栈。
调用约定是调用者和被调用者之间的调用协议,常用于不同开发者编写的库函数之间。
阅读(151) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 台一火花机伺服错误 的文章

 

随机推荐