VC的函数修饰名

VC 中的修饰名(Decoration name)

“C”或者“C++”函数在内部(编译和链接)通过修饰名识别。修饰名是编译器在编译函数定义或者原型时生成的字 符串。有些情况下使用函数的修饰名是必要的,如在模块定义文件里头指定输出“C++”重载函数、构造函数、析构函数,又如在汇编代码里调用“C””或“C ++”函数等。

修饰名由函数名、类名、调用约定、返回类型、参数等共同决定。

    1. 调用约定

调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。MFC支持以下调用约定:

  1. _cdecl

    按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。

    如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ。

    这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。

  2. _stdcall

    按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。

    所有的Win32 API函数都遵循该约定。

  3. _fastcall

    头两个DWORD类型或者占更少字节的参数被放入ECX和EDX寄存器,其他剩下的参数按从右到左的顺序压入栈。由被调用者把参数弹出栈,对于“C”函数或者变量,修饰名以“@”为前缀,然后是函数名,接着是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是@func@12。对于“C++”函数,有所不同。

    未来的编译器可能使用不同的寄存器来存放参数。

  4. thiscall

    仅仅应用于“C++”成员函数。this指针存放于CX寄存器,参数从右到左压栈。thiscall不是关键词,因此不能被程序员指定。

  5. naked call

    采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。

    naked call不是类型修饰符,故必须和_declspec共同使用,如下:

    __declspec( naked ) int func( formal_parameters )

    {

    // Function body

    }

  6. 过时的调用约定

原来的一些调用约定可以不再使用。它们被定义成调用约定_stdcall或者_cdecl。例如:

#define CALLBACK __stdcall

#define WINAPI __stdcall

#define WINAPIV __cdecl

#define APIENTRY WINAPI

#define APIPRIVATE __stdcall

#define PASCAL __stdcall


表7-1显示了一个函数在几种调用约定下的修饰名(表中的“C++”函数指的是“C++”全局函数,不是成员函数),函数原型是void CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_stdcall。

表7-1 不同调用约定下的修饰名

调用约定

extern “C”或.C文件

.cpp, .cxx或/TP编译开关

_cdecl

_test

?test@@ZAXXZ

_fastcall

@test@0

?test@@YIXXZ

_stdcall

_test@0

?test@@YGXXZ


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

You can‘t specify target table ‘XXX‘ for update in FROM clause

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 报错如题,意思大致是:在一条 sql 语句中不能先查出来部分内容,再同时又对当前表作修改。 解决方法&…

牛客网——最简真分数

题目描述 给出n个正整数&#xff0c;任取两个数分别作为分子和分母组成最简真分数&#xff0c;编程求共有几个这样的组合。输入描述: 每组包含n&#xff08;n<600&#xff09;和n个不同的整数&#xff0c;整数大于1且小于等于1000。 输出描述: 每行输出最简真分数组合的个数…

csvn(apache+svn)管理工具搭建

系统环境&#xff1a;centos7.4一、服务端下载这个文件并解压&#xff08;如果打不开&#xff0c;请下方留言&#xff09;https://pan.baidu.com/s/1miwdBc81、安装jdk,上传到服务器上&#xff0c;解压[rootslave2 opt]# tar -zxvf jdk-8u91-linux-x64.gz[rootslave2 opt]# vim…

java中程序执行顺序

①在java中执行顺序 一 静态初始化块 二 非静态初始化块 三 构造器 四 父类构造器 ② java中的赋值顺序 一 静态初始化块直接赋值 二 非静态初始化块直接赋值 三 父类继承的属性已赋值 四 静态变量声明时赋值 五 成员变量声明时赋值 六 构造器赋值 接下来我们用一个…

编程复杂性等级划分

摘要&#xff1a;相信开发人员一定对初级、中级、高级软件工程师这类词汇很熟悉吧&#xff01;你们是否对编程进行过等级划分&#xff1f;这个又是如何划分的呢&#xff1f;本文作者把编程复杂性从简到难化成27个等级&#xff0c;你同意这样的划分吗&#xff1f;通常来说&#…

对于抽象类的理解

这是我个人对抽象类的理解&#xff0c;为什么要有抽象类&#xff0c;因为我们在写某个类时&#xff0c;只能写出大概的一些属性和共性行为&#xff0c;并不能一下子写下所体现的具体细节&#xff0c;如我们学到的一个例子&#xff0c;我们人用打印机&#xff0c;可我们只知道打…

Spring中基于Java的配置@Configuration和@Bean用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Spring中为了减少xml中配置&#xff0c;可以声明一个配置类&#xff08;例如SpringConfig&#xff09;来对bean进行配置。 一、首先&am…

【实数二分/前缀和维护】Best Cow Fences

Poj 2018 Best Cow Fences 实数二分前缀和维护 调了一晚上&#xff0c; 但发现没什么注意事项orz 无输出只因eps定义成了int型QAQ哭唧唧 #include<cstdio> #include<iostream> using namespace std; const int sz 100010; double eps 1e-5; int n, f; double a[s…

json回显

第一种&#xff1a;用json的oData塞值 案例显示&#xff1a; list页面url带值 //活动基本信息修改 function updateProject() {   var selectRow $$.getSingleSelectRow(listId, "请选择你要操作的项目进行修改&#xff01;");   if(selectRow.activity_status&…

NoSuchElementException

在之前下项目的时候遇到这个.NoSuchElementException异常,当时我写到一个大类的结尾。但是编译器。从未报错。然而在运行的时候出现了这样的异常&#xff0c;非常头疼 &#xff0c;一到运行时候就报异常&#xff0c;我就上网搜索了一下&#xff0c;才明白&#xff0c;这是我的刚…

东方程序员怎么看西方程序员

摘要&#xff1a;东方程序员与西方程序员&#xff0c;彼此心中是什么样子呢&#xff1f;本文收集了东西方程序员对彼此的看法与各种印象&#xff0c;对于西方/东方程序员&#xff0c;你留有什么印象呢&#xff1f; 本文是作者根据StackExchange上的一个讨论贴&#xff1a;东方程…

Android开发 - 掌握ConstraintLayout(一)传统布局的问题

在传统的Android开发中&#xff0c;页面布局占用了我们很多的开发时间&#xff0c;而且面对复杂页面的时候&#xff0c;传统的一些布局会显得非常复杂&#xff0c;每种布局都有特定的应用场景&#xff0c;我们通常需要各种布局结合起来使用来实现复杂的页面。随着ConstraintLay…

输入流与输出流的区别

stream结尾都是字节流&#xff0c;reader和writer结尾都是字符流两者的区别就是读写的时候一个是按字节读写&#xff0c;一个是按字符。实际使用通常差不多。在读写文件需要对内容按行处理&#xff0c;比如比较特定字符&#xff0c;处理某一行数据的时候一般会选择字符流。只是…

【Spring】Spring高级话题-@Enable***注解的工作原理

EnableAspectJAutoProxy 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 EnableAspectJAutoProxy注解 激活Aspect自动代理 <aop:aspectj-autoproxy/> 1 开启对AspectJ自动代理的支…

IDEA项目找不到浏览器报错的情况

调tomcat的时候&#xff0c;它会调用浏览器&#xff0c;浏览器关联如果有问题&#xff0c;肯定是会报错的 要是测试的时候&#xff0c;就是浏览器的问题&#xff0c;重新把浏览器装一遍让他自己重新关联一下应该就行了转载于:https://www.cnblogs.com/Koma-vv/p/10156478.html

c/c++经典面试试题及标准答案

下面的问题我想大部分c/c 程序员 都遇见过.如果没有看过&#xff0c;草根IT特别推荐一下。 一、请填写BOOL , float, 指针变量与“零值”比较的 if 语句。&#xff08;10分&#xff09;请写出 BOOL flag 与“零值”比较的 if 语句。&#xff08;3分&#xff09;标准答案&#x…

微服务拆分

微服务拆分是做微服务架构很重要也很难的话题&#xff0c;很多时候&#xff0c;几个服务是合还是拆在设计团队内也很难达成共识。 当你纠结应该拆分和合并时我建议就先合并&#xff0c;等后面版本迭代需要时有必要再去做拆分。从系统发展的角度说&#xff0c;很多平台也都是从单…

oracle数据库学习笔记

字符函数是ORACLE中最常用的函数: Lower(char):将字符串转化为小写格式 Upper(char):将字符转化为大写的格式 Length(char):返回字符串的长度 Substr(char,m,n):取字符串的子串 Trim,Ltrim,Rtrim:去掉空格 dual 虚表 当没有表可以用的时候 就用虚表 as 当做 可以理解为别…

并发编程-concurrent指南-线程池ExecutorService的使用

有几种不同的方式来将任务委托给 ExecutorService 去执行&#xff1a; execute(Runnable)submit(Runnable)submit(Callable)invokeAny(…)invokeAll(…)execute(Runnable) execute(Runnable) 方法要求一个 java.lang.Runnable 对象&#xff0c;然后对它进行异步执行。以下是使用…

怎样去理解@ComponentScan注解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 怎么样去理解它呢&#xff1f; 1.配置视图控制器 [java] view plain copy package com.apress.prospringmvc.bookstore.web.config; imp…