重载函数编译后的新名字
我們都知道很多語言都支持函數重載,那么編譯器是怎么處理編譯后它們的命名沖突的呢?
1、先給出幾個正確的重載函數:
#include <iostream> using namespace std;int Add(int a, int b) {return a + b; }double Add(double a, double b) {return a + b; }double Add(double a, int b) {return a + b; }double Add(int a, double b) {return a + b; }void Add(void) {; }int main() {int a = 10;int b = 20;double d1 = 1.0;double d2 = 2.0;Add(a, b);Add(d1, d2);return 0; }2、查看編譯后重載函數新名字的方法
a. 在vs2010下面,直接把重載函數都屏蔽了,然后在主函數里調用這些函數,此時會報錯,這時我們在錯誤信息里會看到這些函數的新名字。這種方法比較簡單。
b. 在vs2013下面,,先在解決方案里右鍵你的項目(編譯器界面沒有解決方案的可以用以下方法調出:點擊視圖->解決方案資源管理器或直接Ctrl+Alt+L),接著依次點擊:屬性->配置屬性->鏈接器->調試,找到映射導出一欄,把默認的否改為:是 (/MAPINFO:EXPORTS)即,然后重新編譯程序。此時,找到你項目(工程)的位置(在你電腦硬盤上的物理位置),找到Debug文件夾里的后綴為.map的文件,用記事本或其他文檔瀏覽軟件打開,在里面可以用編輯->查找的方式,輸入你的重載函數名,一直查找,直到找到幾個連續的與原函數名字比較相似的新函數名即可,這些就是你的新的函數名。
c. 在Linux下把編譯后的文件反匯編來查看
①建立一個.cpp文件,把代碼拷貝進去
②編譯該文件
③執行命令objdump -d a.out >log.txt反匯編并將結果重定向到log.txt文件中。
④對生成log.txt文件進行分析。
可以看到在log.txt里重載函數的名字變成了對應的這幾個,我們很明顯的發現在Linux里重載函數在反匯編之后的新名字可以很清楚的看出來。
而且我們可以總結出重載函數在反匯編之后出現的新名字的規律(Z3這里權當是一個作用域標識):
作用域+函數名+參數列表參數類型的首字母
總結
以上是生活随笔為你收集整理的重载函数编译后的新名字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python环绕文字_如何用css实现文
- 下一篇: 计算机启用时间 查找方式,电脑实用知识技