編譯器處理相關

2021-07-02 01:51:44 字數 2148 閱讀 7689

一.預處理器-編譯器-彙編器-鏈結器

預處理器會處理相關的預處理指令,一般是以"#"開頭的指令。如:#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 實際工程工具鏈替代的沒有...