C 和C++ 名称修饰规则
C名称修饰规则
1.对于使用__cdecl调用约定的函数,在函数名称前加一下划线,不考虑参数和返回值。
2.对于使用__fastcall调用约定的函数,在函数名称前后各加一@符号,后跟参数的长度,不考虑返回值。
例如 extern “C” int __fastcall Test(int n)的修饰名称为@Test@4.
3.对于使用 __stdcall 标准调用约定的函数,在函数名称前加一下划线,名称后加一@符号,后跟参数的长度,不考虑返回值。
例如 extern “C” int __stdcall Test(int n,int m)的修饰名称为 _Test@8
C++名称修饰组成部分
- 问号前缀
- 函数名称或不包括类名的方法名称。构造函数和析构函数具有特别的民称,分别为?0和?1。运算符重载也具有特别的名称,例如new ,delete ,= , +和++的名称分别为?2, ?3, ?4, ?H和?E,我们把这些特别的函数名称简称为特殊函数名。
- 如果不是特殊函数名,那么加一个分隔符@
- 如果是类的方法,那么由所属类开始依次加上类名和父类名,每个类名后面跟一个@符号,所有类名加好后,再加上一个@符号和字符Q或者S(静态方法)。如果不是类的方法,那么直接加上@符号和字符Y.
- 调用约定代码。对于不属于任何类的函数,C调用约定(__cdecl)的代码为A,__fastcall约定的代码为I,__stdcall 的代码为G,对于类方法,调用约定前会加一个字符A,this调用的代码为E.
- 返回值编码。 例如字符H代表整数类型的返回值
- 参数列表编码,以@符号结束。
- 后缀Z。
C++名称修饰组成规律
一:都是以?开始,以字符Z结束,中间由@符号分割为多个部分。整个名称的长度最长为2048个字节。
二:对于类的函数,其基本结构为:?方法名@类名@@调用约定 返回类型 参数列表 Z。
三:对于不属于任何类的函数,其基本结构: ?函数名@@Y调用约定 返回类型 参数列表Z。
例如:
Int __cdecl TestFunc(int ,int ) 修饰名称为?TestFunc@@YAHHH@Z
@Y表明不是类的方法
A代表调用约定 __cdecl
一个H代表返回值为整数类型,后两个H代表两个整型参数
Public int CTest::SetName(char*,…) 修饰名称为 ?SetName@CTest@@QAAHPADZZ
?是前缀
SetSetName是方法名
CTest是类名
@Q表示类名结束
第一个A为C++方法的调用约定前缀,后面的A表示C调用约定(因为声明中包含可变数量参数,所以编译器会自动使用_cdecl)。
H表示返回值类型(整数)
PAD为参数编码,Z是后缀
再例如构造函数
Public : CTest::CTest(void),修饰名称为 ??0CTest@@QAE@XZ
?0 代表构造函数
CTest 表示类名
@Q 表示类名结束
AE 表示this 调用约定
例如运算符重载:
public :void CTest::operator delete (void*) 修饰名称为??3CTest@@SAXPAX@Z
@S表示重载delete 运算符被自动编译成静态方法,重载new 也是如此。
C 和C++ 名称修饰规则的更多相关文章
- DLL中调用约定和名称修饰(一)
DLL中调用约定和名称修饰(一) 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议.这种协议规定了该语言的函数中的参数传送方式.参数是否可变和由谁来 ...
- C/C++/动态链接库DLL中函数的调用约定与名称修饰
参见:http://blog.twofei.com/cc/impl/calling-convension.html 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用 ...
- C/C++:函数的调用约定(Calling Convention)和名称修饰(Decorated Name)以及两者不匹配引起的问题
转自:http://blog.csdn.net/zskof/article/details/3475182 注:C++有着与C不同的名称修饰,主要是为了解决重载(overload):调用约定则影响函数 ...
- PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则
PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...
- C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数
我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...
- C++编译器的函数名修饰规则
我们知道在C++中有函数重载这样一个东西,当我们定义了几个功能类似且函数名是一样的函数的时候,只要它的参数列表不同,编译是可以通过的,但是在C中是不可以的. double add(double a, ...
- Reface.NPI 方法名称解析规则详解
在上次的文章中简单介绍了 Reface.NPI 中的功能. 本期,将对这方法名称解析规则进行详细的解释和说明, 以便开发者可以完整的使用 Reface.NPI 中的各种功能. 基本规则 方法名称以 I ...
- const修饰规则 及其 用法
const指针和指向const变量的指针,在写法上容易让人混淆,记住一个规则:从左至右,依次结合,const就近结合. 比如,int * const p: 1.int * (const p):变量p经 ...
- 描述Linux发行版的系统目录名称命名规则以及用途
linux各种发行版都遵循LSB(Linux Stadards Base)规则,使用一致的相关的基础目录名称,使用根目录系统结构(root filesystem),使用FHS(Files Hierar ...
随机推荐
- Java动态替换InetAddress中DNS的做法简单分析1
在java.net包描述中, 简要说明了一些关键的接口. 其中负责networking identifiers的是Addresses. 这个类的具体实现类是InetAddress, 底层封装了Inet ...
- Client–server model
Client–server model From Wikipedia, the free encyclopedia The client–server model of computing ] Oft ...
- 关于sqlserver身份登录失败的解决方法
前几天写程序需要用到数据库,下载了一个用用,出现了不少的小问题(都怪我的32bit不争气的笔记本),有问题不要怕,至少证明我们在思考解决方案.废话不说了,直接上正题. Sqlserver有两种登陆方式 ...
- Java Day 16
基本数据类型包装类 Integer.MAX_VALUE Integer.parseInt(); intValue(); valueOf(); 自动装拆箱 如果是一个字节范围,数据共享 字符串中 数值 ...
- ABAP自定义类的构造方法
REPORT ytest_011. *----------------------------------------------------------------------* * CLASS z ...
- 20145129 《Java程序设计》第1周学习总结
20145129 <Java程序设计>第1周学习总结 教材学习内容总结 在第一章学习后初步了解了Java历史及发展,以及JCP,JSR,JVM的相关知识了解.JCP是一个开放性国际组织,由 ...
- liferay MVCActionCommand的用法及例子
在liferay7中把portlet中的控制层拆成了3个部分: 1.MVCActionCommand 2.MVCRenderCommand 3.MVCRecourceCommand 至于为什么要拆出来 ...
- 怎么用PHP发送HTTP请求(转载)
本文转自:http://blog.snsgou.com/blog/161.html file_get_contents版本: /** * 发送post请求 * @param string $url ...
- char a[] = "hello"; char c[] = {'h','e','l','l','o'}; int b[] = {1, 2, 3, 4, 5};的长度区别,及内存中空间开辟情况
1, char a[] = "hello"; char c[] = {'h','e','l','l','o'}; int b[] = {1, 2, 3, 4, 5}; 数组是开辟一 ...
- 设计模式之状态模式(State)
状态模式原理:随着状态的变化,对象的行为也发生变化 代码如下: #include <iostream> #include <string> #include <list& ...