c++函数修饰名转换规则

前言

近日在做百度干净云v5版本的时候,由于优化的地方比较多,每次分析官方文件的时候 都得手动转换他用c++导出的函数名,十分的不方便,话说懒人推动社会进步,于是 我便有了这次探索。

理论知识

c++ 由于可以导出类等复杂的概念,所以不再像c一样导出的函数名的阅读性,而是有他自己的的 规则。这些规则虽然比起c来讲阅读性没有一点,但是胜在里面东西十分齐全,完全可以 还原这个函数的定义,基本上等同于一个函数指针的强大。 他里面甚至不仅包含了调用约定,参数个数,甚至连返回值的类型,参数的类型等都有标注。

调用协议的的编码表示

CodeExported?Calling Convention
ANo__cdecl
BYes__cdecl
CNopascal fortran
DYes__pascal
ENo__thiscall
FYes__thiscall
GNo__stdcall
HYes__stdcall
INo__fastcall
JYes__fastcall
KNonone
LYesnone
MNo__clrcall

数据类型的编码表示

这里所说的类型,包括数据类型、函数指针的类型、函数模板、类模板等不需要分配内存空间的一些概念属性。类型是数据对象与函数这两类实体的属性。

编码不带下划线(_)的含义前置下划线(_)的含义
?用于表示模板
$用于表示模板__w64 (prefix)
0-9Back reference即用于重复出现的类型或名字的简写
AType modifier (reference)
BType modifier (volatile reference)
Csigned char
Dchar__int8
Eunsigned charunsigned __int8
Fshort__int16
Gunsigned shortunsigned __int16
Hint__int32
Iunsigned intunsigned __int32
Jlong__int64
Kunsigned longunsigned __int64
L__int128
Mfloatunsigned __int128
Ndoublebool
Olong doubleArray
PType modifier (pointer)
QType modifier (const pointer)
RType modifier (volatile pointer)
SType modifier (const volatile pointer)
Tunion
Ustruct
Vclass
Wenumwchar_t
Xvoid, Complex Type (coclass)Complex Type (coclass)
YComplex Type (cointerface)Complex Type (cointerface)
Z(ellipsis)

自动化

话说每次这样手动对着转换真的很累,而且容易出错。话说这个活就很适合让程序 自己干,其实微软已经提供了接口,我简单的搞了个小工具,用于自动转换。

将会输出

bool __cdecl apiname(unsigned char,unsigned char,char *)

github

https://github.com/rozbo/UnDecorate

版权说明

本页地址为 https://post.zz173.com/detail/19178.html,本文作者为落月
本文采用 署名-相同方式共享 3.0 中国大陆许可协议 ,分享、演绎需署名且使用相同方式共享。转载请务必保留本页网址和作者信息,否则即为侵权。

– EOF –