首頁>技術>

C語言型別

C的型別分為:

物件型別(char、int、陣列、指標、結構體等)函式型別不完全型別什麼是不完全型別?

C/C++中不完全型別有三種不同形式: void、未指定長度的陣列以及具有非指定內容的結構和聯合。使用不完全型別的指標或引用,不需要知道型別的全部內容。 比如:

我們常用以下方式宣告陣列:

extern int array[];

此時的array就是一個不完全型別的陣列,一般這樣的陣列宣告會放在.h中,而其定義放在.c中,在定義的時候在給出陣列的具體長度,若之後有需要改變陣列的長度時,直接改.c裡的就可以,對外的.h就保持原樣不用修改。

用陣列來說明可能還是有點不太好理解,下面我們用結構體的例子來做說明。

在此之前,我們先思考一個問題,我們的結構體實體是在標頭檔案中定義還是原始檔中定義呢?

實際上,在標頭檔案、原始檔中定義都可以。

下面我們以一個動態陣列的管理為例來做一些演示說明。

在此之前,有必要認識一下動態陣列(以下說明來自百度百科):

動態陣列,是相對於靜態陣列而言。靜態陣列的長度是預先定義好的,在整個程式中,一旦給定大小後就無法改變。而動態陣列則不然,它可以隨程式需要而重新指定大小。動態陣列的記憶體空間是從堆(heap)上分配(即動態分配)的。是透過執行程式碼而為其分配儲存空間。當程式執行到這些語句時,才為其分配。程式設計師自己負責釋放記憶體。使用動態陣列的優點是可以根據使用者需要,有效利用儲存空間。

(1)結構體實體定義在標頭檔案中

比如我們本次的demo有如下三個檔案:

此時dynamic_array.h的內容如下:

我們建立了一些介面函式來操作DA物件,我們希望他人可以使用我們的這些介面來操作資料。並且,一般我們使用其它人寫的程式碼時,一般也是優先找到相關標頭檔案,然後呼叫標頭檔案裡提供的對外介面函式。

但是,從這個標頭檔案中,我們不僅僅看到了一些對外介面,還可以看到結構體實體。於是乎,可能就有些人寫出這樣的程式碼:

命名有介面可以用,卻偏偏有人喜歡直接操作資料,這是比較容易出錯的做法。而且呼叫者推鍋的理由很充足:你暴露資料給我,我為什麼不可以直接操控你的資料,我就不喜歡用你提供的介面,咋的。。。

所以dynamic_array.h的提供者還是得背鍋。

(2)結構體實體定義在原始檔中

為了不被推鍋,我們把我們的標頭檔案改為:

此時,這裡的dynamic_array_def結構型別就是一個不完全型別。

我們把結構體實體定義挪到原始檔中,這時候呼叫者看不到dynamic_array_def裡有什麼資料了,間接得就可以強迫呼叫者使用我們提供的介面了。此時如果出問題被推鍋,那我們也樂意接鍋,樂意查詢問題呀。

最後,順便貼一下本demo工程完整程式碼,有需要的朋友自取:

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • PostgreSQL WAL日誌詳解