C/C++源檔案到可執行檔案
翻譯環境


程序總結:
■ 1、組成一個程式的每個源檔案通過編譯程序分別轉換為對應的每個目標檔案,
■ 2、每個目標檔案通過聯結器捆綁在一起,形成單一而完整的可執行程式,
■ 3、聯結器同時也會引入標準C/C++庫函式中任何被該程式所用到的函式,而且還會搜索程式員個人的程式庫,將其需要的函式也鏈接到程式中來,
翻譯環境中的每一步具體干了什么
每個程序總結:
■ 1. 預處理:為正式編譯做準備,1.頭檔案展開,2.宏替換,3.去掉注釋,在Linux環境下用命令gcc -E test.c -o test.i 預處理完成之后就停下來,預處理之后產生的結果都放在test.i檔案中,
■ 2. 翻譯:把C/C++語言代碼翻譯成匯編代碼,1.語法分析,語意分析,詞法分析,2.符號匯總,等在Linux環境下用命令gcc -E test.c -o test.i 預處理完成之后就停下來,預處理之后產生的結果都放在test.i檔案中,
■ 3. 匯編:把匯編代碼轉換成二進制代碼,形成符號表,等在Linux環境下用命令gcc -S test.c編譯完成之后就停下來,結果保存在test.s中,
■ 4. 鏈接:生成可執行代碼,合并段表,符號表的合并和重定位,等在Linux環境下用命令gcc test -o test.out(名字可隨意取),
C++能多載C語言不能多載本質
函式多載定義:是函式的一種特殊情況,C++允許在同一個作用域中宣告幾個功能類似的同名函式,這些同名函式的形參串列(引數個數或型別或順序不同),常用來處理實作功能類似資料型別不同的問題,
int add(int left,int right){
return left+right;
}
double add(double left,double right){
return left+right;
}
long add(long left,long right){
return left+right;
}
名字修飾
問題:為什么C++支持函式多載,而C語言中不支持函式多載?
在上面我們已經知道了一個程式要生成可執行程式要經歷: 預處理、編譯、匯編、鏈接 四個階段,
1.例如:當前a.cpp中呼叫了b.cpp中定義的Add函式時,編譯后鏈接前, a.o的目標檔案中沒有Add的函式地址,因為Add是在b.cpp中定義的,所以Add的地址在b.o中,那么怎么辦呢?
2.鏈接階段:就是專門處理這種問題,聯結器看到a.o呼叫Add,但是沒有Add的地址,就會到b.o的符號表中找Add的地址,然后鏈接到一起,
3.那么鏈接時,面對Add函式,連接器會使用哪個名字去找呢?這里每個編譯器都有自己的函式名修飾規則,
4.由于Windows下vs的修飾規則過于復雜,而Linux下gcc的修飾規則簡單易懂,下面我們使用了gcc演示了這個修飾后的名字,注意圖片中是匯編指令,我將一個源檔案編譯成可執行檔案后轉到它的匯編代碼,我們來看看匯編代碼中的函式的名稱,命令objdump -S testc[可執行檔案名]
#include<stdio.h>
int add(int x,int y){
return x+y;
}
int main(){
printf("%d\n",add(1,5));
return 0;
}

#include<iostream>
int add(int x,int y){
return x+y;
}
double add(double x,double y){
return x+y;
}
int main(){
cout<<add(1,5);
return 0;
}

通過實列我們可以看出對于C語言的函式修飾后名字不變,而C++的函式修飾后變成【_Z+函式長度+函式名+型別首字母】,這個就是為什么多載函式要求引數串列的個數、型別或者順序不一樣了,因為編譯后要保證生成的名字修飾不同,
extern “c”
有時候在C++工程中可能需要將某些函式按照C的風格來編譯,在函式前加extern “C”,意思是告訴編譯器,將該函式按照C語言規則來編譯,
//例一:
extern "C" int Add(int left, int right);//告訴編譯器將該函式使用C++語言規則來編譯,然后鏈接的時候就能正常鏈接
int main()
{
Add(1,2);
return 0;
}
//例二:如果函式太多可以使用這種形式只需要宣告一次,不需要每一個函式前面都加extern "C"
#ifdef __cplusplus
extern "C" {
#endif
#include<stdio.h>
int strcmp(const char *,const char *);
#ifdef __cplusplus
}
#endif
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256020.html
標籤:其他
上一篇:《Python編程:從入門到實踐》專案實體:外星人入侵 源代碼+pyinstaller打包教程 ~小白也能懂的喔1/2
下一篇:關于影像識別中的目標檢測+分類
