C++编译时函数名修饰约定规则:
__stdcall调用约定:
1、以"?"标识函数名的开始,后跟函数名;
2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;
3、参数表以代号表示:
B:const
D:char
E:unsigned char
F:short
G:unsigned short
H:int
I:unsigned int
J:long
K:unsigned long
M:float
N:double
_N:bool
PA:指针(*,后面的代号表明指针类型,如果相同类型的指针连续出现,以0代替,一个0代表一次重复)
PB:const指针
AA:引用(&)
AB:const引用
U:类或结构体
V:Interface(接口)
W4:enum
X:void
Z: 结尾标记
@: 空,无得意思,构造或析构使用,与?0, ?1配合
4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;
5、参数表后以"@Z"标识整个名字的结束,如果该函数无参数,则以"Z"标识结束。
其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如
int Test1(char *var1, unsigned long)-----"?Test1@@YGHPADK@Z" void Test2()-----"?Test2@@YGXXZ"
6、
@@QAE: public __thiscall
@@AAE: private __thiscall
@@QBE: public __thiscall const
__cdecl调用约定:
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"。
__fastcall调用约定:
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI"。
#ifndef TESTCLASSLIB_H
#define TESTCLASSLIB_H
#include "testclasslib_global.h"
class TESTCLASSLIBSHARED_EXPORT TestClassLib
{
public:
TestClassLib();
public:
struct TestStruct{
TestStruct();
bool accept(int i) const;
int _overrideValue;
int* _accept;
bool operator < (const TestStruct& rhs) const;
};
struct TestStruct1{
public:
TestStruct1(int i);
TestStruct1();
void test();
bool accept(int i) const;
int _overrideValue;
int* _accept;
bool operator < (const TestStruct& rhs) const;
};
struct TESTCLASSLIBSHARED_EXPORT TestStruct2{
public:
void test();
bool accept(int i) const;
int _overrideValue;
int* _accept;
bool operator < (const TestStruct& rhs) const;
};
class TestClass{
public:
TestClass(int i);
TestClass();
void test();
bool accept(int i) const;
int _overrideValue;
int* _accept;
bool operator < (const TestStruct& rhs) const;
};
void myTes