C 編譯,前置宣告

2021-06-19 20:32:53 字數 1299 閱讀 5006

class a ;

class b ;

存在類巢狀的問題,編譯無法通過。採用前置宣告解決

class b;

class a ;

class b ;

以上**還是錯誤的,因為在編譯期間對於類的定義需要知道其成員變數型別的大小。將a.b改為指標,因為對於特定的平台指標大小事固定的。

如下是編譯四個階段的過錯。其中編譯階段不會去尋找用到的標頭檔案中的函式的定義,只是按照一定規格轉換**格式組合語言然後通過彙編階段轉化為二進位制(.o)。在鏈結階段,會在obj檔案中查詢函式的實現。

在使用gcc進行程式的編譯時通常要經歷四個階段(通常指的是從源程式到可執行的二進位制**這整個過程),一些以hello.c為例來說明這四個階段。

hello.c

#includeint main()

gcc的四個階段如下:

1.預處理階段

2.編譯階段

3.彙編階段

4.鏈結階段

四個階段的詳細資訊如下:

1.預處理階段

執行程式:cpp

作用:(1)展開源程式中定義的巨集。(2)在源程式中插入include所包含的檔案等

執行方法:gcc–e hello.c –o hello.i

執行結果:字尾名為.i的檔案,如hello.i

2.編譯階段

執行程式:ccl作用:檢查**的規範性、是否具有語法錯誤等,並把預處理的檔案編譯成可讀彙編**。

執行方法:gcc –s hello.i –o hello.s

執行結果:字尾名為.s的檔案,如hello.s

3.彙編階段

執行程式:as作用:把彙編階段生成.s檔案匯編成具體cpu上的目標**。

執行方法:gcc–c hello.s –o hello.o

執行結果:生成字尾為.o的檔案,如hello.o

4.鏈結階段

執行程式:ld

執行方法:gcc hello.o –o hello

執行結果:生成可執行的二進位制檔案,如hello

總結:

階段程式

gcc選項

輸入檔案

輸出檔案

預處理cpp

-e.c或者其他(hello.c)

.i(hello.i)

編譯ccl

-s.i(hello.i)

.s(hello.s)

彙編as

-c.s(hello.s)

.o(hello.o)

鏈結ld

無.o(hello.o)

C 前置宣告

特點 被宣告的類不用重新編譯,節省編譯時間 比如a包含乙個指向b的指標,b包含a的乙個例項,這種情況下,使用前置宣告。易錯的點 class date class task1 因為分配器為d分配記憶體的時候,必須要知道 d的大小 主要應用場景是兩個標頭檔案相互包含的場景,建議僅將前置宣告用於解決迴圈引...

C 前置宣告

一般的前置函式宣告 見過最多的前置函式宣告,基本格式 如下 1 include 2 using namespace std 34 void fun char ch,int pvalue,double dvalue 56 void main 714 15void fun char ch,int pva...

C 前置宣告

問題 最近遇到了兩個類a b相互呼叫的情況,於是想當然的在兩個類a和b的標頭檔案中 include 了所需的標頭檔案,當然結果編譯報錯了。為什麼呢,a需要b,b需要a,形成了迴圈,違反了程式的確定性原則。如下圖所示 如這樣相互包含的問題,可以使用前置宣告來解決。即 在標頭檔案中宣告該類,在實現檔案中...