C和C 編譯器的函式名修飾規則

2021-07-12 02:27:10 字數 1247 閱讀 9141

c編譯器的函式名修飾規則 :

對於__stdcall呼叫約定,編譯器和鏈結器會在輸出函式名前加上乙個下劃線字首,函式名後面加上乙個「@」符號和其引數的位元組數

例如_functionname@number。

__cdecl呼叫約定僅在輸出函式名前加上乙個下劃線字首

例如_functionname。

__fastcall呼叫約定在輸出函式名前加上乙個「@」符號,後面也是乙個「@」符號和其引數的位元組數

例如@functionname@number 

c++編譯時函式名修飾約定規則:

__stdcall呼叫約定:   

1、以"?"標識函式名的開始,後跟函式名;   

2、函式名後面以"@@yg"標識參數列的開始,後跟參數列;   

3、參數列以代號表示:   

x--void   ,   

d--char,   

e--unsigned   char,   

f--short,   

h--int,   

i--unsigned   int,   

j--long,   

k--unsigned   long,   

m--float,   

n--double,   

_n--bool,   

....   

pa--表示指標,後面的代號表明指標型別,如果相同型別的指標連續出現,以"0"代替,乙個"0"代表一次重複; 

4、參數列的第一項為該函式的返回值型別,其後依次為引數的資料型別,指標標識在其所指資料型別前;     

5、參數列後以"@z"標識整個名字的結束,如果該函式無引數,則以"z"標識結束。   

其格式為"?functionname@@yg*****@z"或"?functionname@@yg*xz",例如   

int   test1(char   *var1,unsigned   long)-----「?test1@@yghpadk@z」   

void   test2()                           -----「?test2@@ygxxz」   

__cdecl呼叫約定:   

規則同上面的_stdcall呼叫約定,只是參數列的開始標識由上面的"@@yg"變為"@@ya"。  

__fastcall呼叫約定:   

規則同上面的_stdcall呼叫約定,只是參數列的開始標識由上面的"@@yg"變為"@@yi"。

**:

編譯器的函式名修飾規則

函式的名字修飾 decorated name 就是編譯器在編譯期間建立的乙個字串,用來指明函式的定義或原型。link程式或其他工具有時需要指定函式的名字修飾來定位函式的正確位置。多數情況下程式設計師並不需要知道函式的名字修飾,link程式或其他工具會自動區分他們。當然,在某些情況下需要指定函式的名字...

C 函式名的修飾規則

我們知道在c 中有函式過載這樣乙個東西,當我們定義了幾個功能類似且函式名是一樣的函式的時候,只要它的引數列表不同,編譯是可以通過的,但是在c中是不可以的。double add double a,double b int add int a,char b char add char a,char b ...

編譯器的符號修飾規則

編譯器編譯源 生成目標檔案時,需要為每乙個變數 函式生成符號,儲存到符號表。在符號表中,每乙個符號必須唯一,因此要求源 中不能存在與其它檔案中的變數名 函式名相同的函式,包括使用到的庫中的函式。為了解決符號名衝突的問題,編譯器會對源 中的符號進行修飾,如unix下編譯生成的符號會在符號名前加下劃線 ...