调用约定
_cdecl c语言标准调用约定
_stdcall windows标准调用约定
_fastcall 快速调用约定
_thiscall 类成员方法的调用约定
对于形参的开辟和清理:
cdecl 由调用方开辟,由调用方清理;
stdcall 由调用方开辟,被调用方清理;
fastcall 前两个参数不开辟内存,之后的参数由调用方开辟,被调用方清理
c/c++符号生成规则
.c 文件中,函数符号的生成只与函数名相关。
如下 .c 代码:
#include<stdio.h>
int Sum(int a,int b)
{
return a+b;
}
double Sum(double a,double b)
{
return a+b;
}
float Sum(float a,float b)
{
return a+b;
}
代码编译时,会报如下错误:
.cpp 函数生成规则和函数原型有关,如下代码,在.cpp文件下可运行:
#include<iostream>
using namespace std;
int Sum(int a,int b)
{
std::cout<<"int Sum(int,int)"<<std::endl;
return a+b;
}
double Sum(double a,double b)
{
std::cout<<"double Sum(double,double)"<<std::endl;
return a+b;
}
float Sum(float a,float b)
{
std::cout<<"float Sum(float,float)"<<std::endl;
return a+b;
}
C++对于_cdecl方式,参数表的开始标识是@@YA ;对于_stdcall方式,参数表的开始标识是@@YG ;对于_fastcall方式,参数表的开始标识是@@YI 。
如上.cpp代码中每个Sum函数可表示为:
int 型:?Sum@@YAHHH@Z
double型:?Sum@@YANNN@Z
float型:?Sum@@YAMMM@Z
因此并不会造成编译时符号重定义的错误。