1. 基本概念
调用约定
调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。
名称修饰
在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便允许同一个名字(具有不同的参数类型或者是不同的作用域)有多个用法,而不会打破现有的基于C的链接器。这项技术通常被称为名称改编(Name Mangling)或者名称修饰(Name Decoration)。许多C++编译器厂商选择了自己的名称修饰方案。
2. 调用约定
2.1 __cdecl
C/C++和MFC程序默认使用的调用方式,参数个数可变,由函数调用者清栈(定义部分不知道参数数量,故无法处理)
2.2 __stdcall
用于调用Win32 API函数。参数个数固定,函数在返回前清空传递参数的堆栈。
2.3 __fastcall
用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传递,被调用函数在返回前清理传递参数的堆栈。
关键字 __cdecl、__stdcall、__fastcall 可以直接加在要输出的函数前,也可以在编译器的命令行参数设置,分别对应为 /Gd、/Gz、/Gr。缺省状态为

本文介绍了C++中的调用约定,包括__cdecl、__stdcall和__fastcall,以及名称修饰的概念和作用。调用约定规定了参数传递方式和堆栈清理责任,而名称修饰则用于解决函数重载和操作符重载时的符号名冲突问题。extern关键字在C++中用于指示变量或函数的定义位于其他模块,它可以与static配合使用,以控制变量的作用域和链接属性。
最低0.47元/天 解锁文章
633

被折叠的 条评论
为什么被折叠?



