一.預處理器-編譯器-彙編器-鏈結器
預處理器會處理相關的預處理指令,一般是以"#"開頭的指令。如:#include "xx.h" #define等。
編譯器把對應的*.cpp翻譯成*.s檔案(組合語言)。
彙編器則處理*.s生成對應的*.o檔案(obj目標檔案)
最後鏈結器把所有的*.o檔案鏈結成乙個可執行檔案(?.exe)
1.部件:
首先要知道部件(可以暫且狹義地理解為乙個類)一般分為標頭檔案(我喜歡稱為介面,如:*.h)及實現檔案(如:*.cpp)。
一般標頭檔案會是放一些用來作宣告的東東作為介面而存在的。
而實現檔案主要是實現的具體**。
2.編譯單個檔案:
記住ide在bulid檔案時只編譯實現檔案(如*.cpp)來產生obj,在vc下你可以對某個?.cpp按下ctrl+f7單獨編譯它
生成對應乙個?.obj檔案。在編譯?.cpp時ide會在?.cpp中按順序處理用#include包括進來的標頭檔案
(如果該標頭檔案中又#include有檔案,同樣會按順序跟進處理各個標頭檔案,如此遞迴。。)
4.#include規則:
有很多人不知道#include 檔案該放在何處?
1). 增強部件自身的完整性:
為了保證部件完整,部件的cpp實現檔案(如test.cpp)中第乙個#include的應當是它自身對應的標頭檔案(如test.h)。
(除非你用預編譯標頭檔案, 預編譯頭必須放在第乙個)。這樣就保證了該部件標頭檔案(test.h)所必須依賴的其它介面(如a.h等)要放到它對應的檔案頭中(test.h),而不是在cpp中(test.cpp)把所依賴的其它標頭檔案(a.h等)移到其自身對應的標頭檔案(test.h等)之前(因為這樣強迫其它包括此部件的標頭檔案(test.h)的檔案(b.cpp)也必須再寫一遍include(即b.cpp若要#include "test.h"也必須#include "a.h")」。另外我們一般會儘量減少檔案頭之間的依賴關係,看下面:
2). 減少部件之間的依賴性:
在1的基礎上盡量把#include到的檔案放在cpp中包括。
這就要求我們一般不要在標頭檔案中直接引用其它變數的實現,而是把此引用搬到實現檔案中。
例如:// 檔案foo.h:
class cfoo
};// 檔案test.h:
#include "foo.h"
class ctest
void test()}
...........
};// 檔案test.cpp:
#include "test.h"
.....
如上檔案test.h中我們其實可以#include "foo.h"移到test.cpp檔案中。因為cfoo* m_pfoo我們只想在部件ctest中用到,
而將來想用到ctest部件而包括test.h的其它部件沒有必要見到foo.h介面,所以我們用前向宣告修改原檔案如下:
// 檔案foo.h:
class cfoo
};// 檔案test.h:
class cfoo;
class ctest;
// 檔案test.cpp:
#include "test.h" // 這裡第乙個放該部件自身對應的介面標頭檔案
#include "foo.h" // 該部件用到了foo.h
ctest::ctest() : m_pfoo(0)
void ctest::test()
}//.....
// 再加上main.cpp來測試:
#include "test.h" // 這裡我們就不用見到#include "foo.h"了
ctest test;
void main()
3). 雙重包含衛哨:
在檔案頭中包括其它標頭檔案時(如:#include "xx.h")建議也加上包含衛哨:
// test.h檔案內容:
#ifndef __xx1_h_
#include "xx1.h"
#endif
#ifndef __xx2_h_
#include "xx2.h"
#endif......
雖然我們已經在xx.h檔案中開頭已經加過,但是因為編譯器在開啟#include檔案也
是需要時間的,如果在外部加上包含衛哨,對於很大的工程可以節省更多的編譯時間。
編譯器相關問答
1 編譯器編譯的時候,預設到 找標頭檔案,如果不在怎麼指定編譯器到 找標頭檔案?1 如果標頭檔案用 引用,則預設到 usr include或 usr local include下找,交叉編譯器則在對應的路徑的子目錄usr include下找 2 如果標頭檔案用 引用,則先到當前目錄下找標頭檔案,如果...
UNIX LINIUX編譯器相關
標準 unix程式設計環境和c程式語言標準化.標準化有多種,例如iso c制定的.unix標準不同,同它相關的或者能夠支援的標準c庫也不完全相同.例如關鍵字,標頭檔案 及其相關的功能 系統介面 標頭檔案及定義,實用程式等等,有些標準有,有些沒有.unix標準有多種,實現也有多種.iso c的標頭檔案...
ARM編譯器相關
當前的arm 編譯器在2016年就開始使用arm compiler 6。即將armcc改為armclang。compiler 6之前 dui0471 m embedded software development compiler 6 100748 0614 preface 實際工程工具鏈替代的沒有...