- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2013年微软暑期实习生笔试试题详解
以下为本人根据不清楚的录像整理,如有错误欢迎反馈!
1、下面哪项可以实现可变参数的传递,例如函数printf的参数就是可变的。(D)
cdecl
stdcall
pascal
fastcall
_cdecl
(1). 是C Declaration的缩写,表示C语言默认的函数调用方法,实际上也是C++的默认的函数调用方法。
(2). 所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。具体所示:调用方的函数调用-被调用函数的执行-被调用函数的结果返回-调用方清除调整堆栈。
(3). 被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。总的来说函数的参数个数可变的(就像printf函数一样),因为只有调用者才知道它传给被调用函数几个参数,才能在调用结束时适当地调整堆栈。
(4). 因为每个调用的地方都需要生成一段调整堆栈的代码,所以最后生成的文件较大。
_stdcall(CALLBACK/WINAPI)
(1). 是Standard Call的缩写,要想函数按照此调用方式必须在函数名加入_stdcall,通常_ win32 api 应该是_stdcall调用规则。通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为_stdcall?方式,WINAPI都采用这种方式。
(2). 所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。具体所示:调用方的函数调用-被调用函数的执行- 被调用方清除调整堆栈-被调用函数的结果返回。
(3). 这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retn X,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。
(4). 函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。总的来说,就是函数的参数个数不能是可变的。是从 _cdecl 修改而来, _stdcall 不支持可变参数,并且清栈由被调用者负责,其他的都一样
(5). 因为只需在被调用函数的地方生成一段调整堆栈的代码,所以最后生成的文件较小。
3. PASCAL 是Pascal语言的函数调用方式,也可以在C/C++中使用,参数压栈顺序与前两者相反。返回时的清栈方式与_stdcall相同。
_fastcall 是编译器指定的快速调用方式。由于大多数的函数参数个数很少,使用堆栈传递比较费时。因此_fastcall通常规定将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。不同编译器编译的程序规定的寄存器不同。返回方式和_stdcall相当。
_thiscall 是为了解决类成员调用中this指针传递而规定的。_thiscall要求把this指针放在特定寄存器中,该寄存器由编译器决定。VC使用ecx,Borland的C++编译器使用eax。返回方式和_stdcall相当。
_fastcall 和 _thiscall涉及的寄存器由编译器决定,因此不能用作跨编译器的接口。所以Windows上的COM对象接口都定义为_stdcall调用方式。
C中不加说明默认函数为_cdecl方式(C中也只能用这种方式),C++也一样,但是默认的调用方式可以在IDE环境中设置。
带有可变参数的函数必须且只能使用_cdecl方式,例如下面的函数:
int printf(char * fmtStr, ...);
int scanf(char * fmtStr, ...);
函数名修饰
(1). _cdecl :对于_cdecl而言,如果对于定义在C程序文件(编译器会通过后缀名为.C判断)的输出函数,函数名会保持原样;对于定义在C++程序文件中的输出函数,函数名会被修饰(见10)。为使函数名不被修饰,有两种方法:A.可通过在前面加上extern “c”以去除函数名修饰;B. 可通过.def文件去除函数名修饰。
(2). _stdcall:无论是C程序文件中的输出函数还是C++程序文件中的输出函数,函数名都会被修饰。对于定义在C++程序文件中的输出函数,好像更复杂,和_cdecl的情况类似。去除函数名修饰方法:只能通过.def文件去除函数名修饰。
10. 函数名修饰规则:
(1). 为什么要函数名修饰:
函数名修饰就是编译器在编译期间创建的一个字符串,用来指明函数的定义和原型。LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。多少情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们。当然,在某些情况下需要指定函数名修饰,例如在c++程序中,为了让LINK程序或其他工
您可能关注的文档
最近下载
- 《懂得爱:在亲密关系中成长》读书笔记.docx VIP
- 上海市中考语文专题复习:文言文虚词简表.pdf VIP
- 广西盐业公司的招聘试卷.pdf VIP
- 2025《民营经济促进法》解读课件PPT.pptx
- Haier海尔空调KFRd-120LW 7YAF81 KFRd-120LW 5YAF82 KFR-12ity 5YAF82用户手册.pdf
- 雪铁龙维修 手册 图DS_5LS_Owner_Book_ZH.pdf VIP
- 烟风煤支吊架设计手册-新版.pdf VIP
- 长期卧床鼻饲患者的护理ppt.pptx VIP
- 教学能力大赛教案--智慧工厂的安全策略之VLAN的划分.docx VIP
- GB 6246-2011 消防水带标准规范‘’.pdf
文档评论(0)