C 學習筆記 編譯器一定要知道型別的大小

2021-08-22 08:09:52 字數 609 閱讀 4686

假設在a.h檔案中定義了乙個結構體,然後在b.cpp中預先宣告這個型別而又不引用標頭檔案a.h,那麼這個結構體可以使用嗎?看看下面的例子:

struct

bb;  

//宣告存在的乙個型別

structaa;

編譯這個程式,gcc顯示錯誤:field `b' has incomplete type

稍稍修改一下這個檔案:

struct

bb;  

//宣告存在的乙個型別

structaa;

編譯通過。

為什麼會這樣呢?c/c++採用靜態的編譯模型,程式執行時結構大小都會在編譯後確定。程式要正確編譯,編譯器必須知道乙個結構所占用的空間大小。在第乙個例子中,結構體bb作為結構體aa的乙個成員,要確定aa的大小,必須知道bb的大小,而bb的定義檔案沒有包含進來,必然編譯不能通過。而第二個例子中,指標的大小與機器的字長有關,不管型別是什麼型別,編譯後指標的大小總是確定的。所以這種情況下不需要知道結構bb的確切定義。

「編譯器一定要知道型別的大小」,這條資訊可以幫助我們在發生編譯錯誤的時候,更快找到錯誤的原因。同時,如果我們需要引入的型別僅僅只是宣告成指標,則這個型別的標頭檔案不必引入,從而這個檔案的編譯速度得到了提高。

你一定要知道的CSS選擇器

什麼是選擇器 每一條css樣式定義由兩部分組成,形式如下 code 選擇器 code 在 之前的部分就是 選擇器 選擇器 指明了 中的 樣式 的作用物件,也就是 樣式 作用於網頁中的哪些元素。基礎選擇器p如 demodiv如 demodiv p,h1,span main p,sider span使用...

你一定要知道的C語言解題思路4

break適用於switch分支語句while,do,for語句 if語句中else相當於break 使用 define pi 3.1415 x 456.789 printf 8.2f x 輸出輸出為 456.79 賦值時注意先加後用a i其他不用 開方 include math.h sqrt 平方...

你一定要知道的C語言解題思路6

雞兔同籠龍問題和硬幣組成問題,暴力解題法。從大到小挨個試 求分針時針差多少度數,將分鐘轉化為小時,將秒針轉化為分鐘 遞推找規律題條理清晰分類找 兩兩配對問題用匈牙利演算法,蔥有匹配需求的一方開始直接匹配,到下面發現衝突之後改線,直到完全匹配或不能匹配了為止 結構體作用很大,幾個數幾個數為一組時候可用...