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;
}