C++中的调用约定和名称修饰

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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个字节的参数分别放在ECXEDX寄存器,其余的参数仍旧自右向左压栈传递,被调用函数在返回前清理传递参数的堆栈。

关键字 __cdecl__stdcall__fastcall 可以直接加在要输出的函数前,也可以在编译器的命令行参数设置,分别对应为 /Gd/Gz/Gr。缺省状态为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值