C++函數名稱的修飾規則

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環境下是不允許的。

束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章