程序編譯的四個階段


四個階段分別是: 預處理,編譯,組裝,鏈接

  1. 預處理將頭文件展開,將宏定義替換,生成符號文件.S
  2. 編譯則包含了詞法檢查,語法檢查,權限檢查, 代碼優化
  3. 組裝:將編譯后的代碼組裝成機器碼, 形成位置無關的目標文件 .o
  4. 鏈接將多個位置無關的目標文件合並成可執行文件

可見組裝才是平台相關的,之前的操作都與平台無關, 換句話說是編譯前端和編譯后端

具體有個例子

一個類的成員變量修改了訪問控制符,在另外一個文件被引用,是否必須編譯修改的文件才能鏈接成功?
答案是不需要
例如我們有 abc.hpp abc.cpp 定義了一個class

class a {
public: 
    int a = 0;
};

在main.cpp 中有引用

int main(){
  a a;
  std::cout << a.a;
}

這樣是可以編譯成功

# 生成main.o abc.o
g++ -c main.cpp abc.cpp
# 鏈接 
g++ -o main main.o abc.o
# 成功 

然后修改public為private 重新編譯abc

g++ -c abc.cpp
# 重新鏈接  
g++ -o main main.o abc.o

#成功!且可以執行  

但是重新編譯main.cpp

g++ -c main.cpp 

#失敗,提示無法訪問private成員  

可見,訪問權限是在編譯期檢查的, 編譯成目標文件后,就不會去檢查了

總結

編譯成目標文件或者庫文件后, 不會再去檢查權限位了, 運行時照樣可以訪問


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM