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,形成了迴圈,違反了程式的確定性原則。如下圖所示 如這樣相互包含的問題,可以使用前置宣告來解決。即 在標頭檔案中宣告該類,在實現檔案中...