1. 程式人生 > >C/C++函式符號生成規則(函式名的修飾);C++ 函式過載

C/C++函式符號生成規則(函式名的修飾);C++ 函式過載

         函式符號(函式的名字修飾):在編譯階段生成的字串,來指明函式的定義或原型 。

C函式符號生成規則:

_cdel呼叫約定(C標準呼叫約定):函式名前加下劃線。

_stdcall呼叫約定:函式名前加下劃線,函式名後加“@”符號和其引數位元組。

_fastcall呼叫約定:函式名前加“@”符號,函式名後加“@”字元和其引數位元組。

C++函式符號生成規則:

_cdecl呼叫約定:“?”+函式名+引數表的開始標識 “@@YA” + 函式返回型別代號+引數型別代號 +結束標識“@Z”或“Z”(無引數)。

_stdcall呼叫約定:“?”+函式名+引數表的開始標識“@@YG”+函式返回型別代號+引數型別代號 +結束標識“@Z”或“Z”(無引數)。

_fastcal呼叫約定:“?”+函式名+引數表的開始標識 “@@YI”+ 函式返回型別代號+引數型別代號 +結束標識“@Z”或“Z”(無引數)。

引數型別代號表
X D E F H I J K M N _N U PA+ PB+ ...
void char unsigned char short int unsigned int long unsigned long float double bool struct 指標+其型別 const指標+其型別 ...

_thiscall呼叫約定(類成員方法的約定):“?” +函式名+ “@”字元引導的類名+引數表的開始標識(函式性質決定)+ 函式返回型別代號+引數型別代號 +結束標識“@Z”或“Z”(無引數)。

引數表的開始標識:公有(public)成員函式的標識“@@QAE”,保護(protected)成員函式的標識“@@IAE”,私有(private)成員函式“@@AAE”;如果使用Const ,則對應的標識“@@QBE”,“@@IBE”,“@@ABE”。

C++函式過載:

在 同作用域 下定義 相同函式名不同引數列表 函式。

  注意:同函式名、同參數列表、返回值不同的函式過載 和 有預設實參函式的過載 不能構成函式過載。編譯器只使用形參列表來區分過載的函式,所以同函式名,同參數列表,返回值不同的函式過載 和 有預設實參函式的過載,編譯無法區分,然後報錯。

int Max(int a, int b);	//[email protected]@[email protected]
double Max(int a, int b);	//[email protected]@[email protected]
double Max1(int a, int b);	//[email protected]@[email protected]
double Max1(int a, double b);	//[email protected]@[email protected]

當呼叫一個過載函式時,C++編譯器通過函式符號(函式修飾名)來選擇恰當的函式。

int Max(int a, int b)//[email protected]@[email protected]
{
	return a > b ? a : b;
}
double Max(double a, double b)//[email protected]@[email protected]
{
	return a > b ? a : b;
}
char Max(char a, char b)
{
	return a > b ? a : b;
}
int main()
{

	int max = Max(10, 20);
	char max = Max('a', 'b');
    double max = Max(0.23,0.21);
	return 0;
}