C++函數名稱修飾規則
int Add(const int a; const int b)
{
return a+b;
}
long Add(const long a,const long b )
{
return a+b;
}
double Add(const double a, const double b)
{
return a+b;
}
在函數重載中就提到過,上面兩個函數同時出現在C環境下會編譯出錯
但是在C++環境中不會出錯,
這就是與函數名稱的修飾規則有關了
在C環境中,默認調用約定爲_cdecl,編輯器此時對函數名的修飾就是在函數名稱前面加上下劃線,這三個函數名相同的函數修飾成功之後都爲_Add,所以就形成了函數的重定義。
而在C++環境中,函數名稱的修飾有些複雜,但是信息更加充分,比如我在上面寫到的 double Add(double a, double b) , 在C++環境中就被修飾爲?Add@@YANNN@Z,這其中就包含了函數名,參數類型,參數個數,調用方式等等
參數列表代號如下:
X–void
D–char
E–unsigned char
F–short
H–int
I–unsigned int
J–long
K–unsigned long(DWORD)
M–float
N–double
_N–bool
U–struct
….
可以看到N是代表double類型,那麼 (?add@@YANNN@Z)就能理解了,函數修飾符?,接着是函數名字,@表示函數名結束,然後是_cdecl約定的開始標示符@YA,然後連着的是返回值類型,參數列表的參數類型剛好是double,那麼double add(double a,double b)就是NNN,參數表後以“@”標識參數列表的結束,然後以“Z”表示整個的結束,如果該函數無參數,則以“Z”標識結束。
還有在C++中的成員函數中公有和私有的成員函數的修飾也有相應的表示符。總而言之,在C++環境中的函數名修飾的時候,會帶有參數列表的信息,還有返回值的信息,所以在C++中的函數重載就是允許存在的,因爲它可以根據你的參數列表選擇對應的函數,而顯然在我們的C環境下是不允許的。
束。