C++霧中風景15:聊聊讓人抓狂的Name Mangling
阿新 • • 發佈:2020-09-27
>Name Mangling,直接翻譯過來為**名字改寫** 。它是深入理解 C++ 編譯連結模型的必由之路。
筆者近期進行資料庫開發工作時,涉及到MySQL客戶端的編譯連結的問題,通過重新釐清了之前理解一知半解的**Name Manging**,解決了讓人抓狂的編譯連結問題。
接下來,和大家聊聊C++的**Name Mangling**。
#### 1.什麼是Name Mangling
##### 1.1 Name Mangling的作用
在進行程式設計的過程之中,我們常常遇見變數或函式重名的情況。比如:**函式的過載**,或通過不同程式塊與名稱空間變數與函式的重名。
而在出現變數或函式名相同的情況下,編譯器進行程式碼編譯時需要保證變數與函式的簽名的全域性唯一性。如果無法進行上述保證,在**連結階段就會產生連結的二義性**,會導致編譯器不知道應該如何取用正確的變數與函式符號的記憶體地址。
為了解決上述問題,編譯器實現了一種叫做**Name Mangling**的方式:**它通過一個固定的命名規則來重新組織原始碼之中我們定義的變數名和函式名,來確保了能夠將被連結的目標檔案中的符號簽名的唯一性。**(由於在C++的標準之中,並未強制規定Name Mangling的實現機制,所以不同的編譯器在不同的平臺上實現是完全不同的。筆者的後續關於Name Mangling的講解將基於Linux上的GCC展開。)
##### 1.2 舉個栗子
上述內容講明白了Name Mangling的意義,我們來通過實際的程式碼來瞅瞅它是如何生效的。
首先看看如下程式碼:
```
#include