_cdecl与_stdcall调用约定

2024-01-09 08:32
文章标签 调用 约定 cdecl stdcall

本文主要是介绍_cdecl与_stdcall调用约定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

调用约定 
  
调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被 
调用者把参数弹出栈,以及产生函数修饰名的方法。MFC支持以下调用约定: 
  
  
1、_cdecl 
  
按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰 
名是在函数名前加下划线。对于“C++”函数,有所不同。 
  
如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰 
名是?test@@ZAXXZ。 
  
这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定 
的参数,如printf函数。 
  
  
2、_stdcall 
  
按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修 
饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int f 
unc(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。所有的W 
in32 API函数都遵循该约定。 
  
3、_fastcall 
  
头两个DWORD类型或者占更少字节的参数被放入ECX和EDX寄存器,其他剩下的参数按从右 
到左的顺序压入栈。由被调用者把参数弹出栈,对于“C”函数或者变量,修饰名以“@ 
”为前缀,然后是函数名,接着是符号“@”及参数的字节数,如函数int func(int a, 
 double b)的修饰名是@func@12。对于“C++”函数,有所不同。未来的编译器可能使用 
不同的寄存器来存放参数。 
  
4、thiscall 
  
仅仅应用于“C++”成员函数。this指针存放于CX寄存器,参数从右到左压栈。thiscal 
l不是关键词,因此不能被程序员指定。 
  
  
5、naked call 
  
采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI, 
EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这 
样的代码。 
  
naked call不是类型修饰符,故必须和_declspec共同使用,如下: 
  
__declspec( naked ) int func( formal_parameters ) 

// Function body 

  
在MFC中有以下宏定义: 
  
#define CALLBACK __stdcall 
#define WINAPI __stdcall 
#define WINAPIV __cdecl 
#define APIENTRY WINAPI 
#define APIPRIVATE __stdcall 
#define PASCAL __stdcall

这篇关于_cdecl与_stdcall调用约定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586511

相关文章

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

React 笔记 父子组件传值 | 父组件调用子组件数据 | defaultProps | propsType合法性验证

1.通过props实现父组件像子组件传值 、方法、甚至整个父组件 传递整个父组件则   [变量名]={this} import Header from "./Header"render(){return(<Header msg={"我是props传递的数据"}/>)} import React,{Component} from "react";class Header extends

java的一些简单调用!

四、context:component-scan     <!-- 对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->     <context:component-scan base-package="com.haso.bscsserver">     <!-- 允许定义过滤器将基包下的某些类纳入或排除     <context:include-filter