在C中使用單個成員結構的兩種方法

2021-07-29 19:01:39 字數 1984 閱讀 7010

我喜歡c的結構。 c中有很多奇怪的東西,但是在大多數情況下,結構是可**的,有用的,易於理解的。

對於不熟悉c的人,結構體是資料集合。結構的乙個例子是笛卡爾平面上的乙個點:

struct point ;

通常,結構體用於關聯兩個或更多個資料。正如標題所示,我將演示為什麼你可能想要使用乙個單一元素的結構體。

保留陣列型別資訊

與結構體不同,c的陣列很麻煩,有許多令人驚訝的角落,很難讓初學者與指標區分開來(這已經很難自己理解了)。我發現最令人困擾的是c的陣列,只要它們在乙個函式或模組邊界被引用時,就放棄它們的大小資訊。

我們來看幾個例子,使用c的sizeof運算子。首先,我們將介紹陣列不令人吃驚的行為。在這個例子中,我們分配陣列,並通過它被宣告的名稱引用它。

void direct_reference()

int main()

這個例子,當執行時,列印值'10',我們期望的。如果我們用這個稱為indirect_reference的新函式替換函式direct_reference,我們看到不同的行為。

void indirect_reference(uint8_t referenced_array[10])

int main()

在我的64位機器上,此示例列印值「8」,這恰好是我系統上指標的大小。請注意,sizeof將references_array視為乙個指標,即使我們已經明確地告訴了這個引用的型別是什麼。

幸運的是,我們可以使用單個成員的結構來跨參考邊界保留這個大小資訊!這是乙個例子。

uint8_t array[10];

};printf("%lu\n", sizeof(a->array));

}int main()

防止強制不需要的型別c提供了一種可以重新命名型別的機制。 typedef關鍵字給了我們一種使count_t類似於int32_t下面的型別的方法。這對於語義很好,但它並沒有給出任何額外的編譯時間安全性。沒有什麼可以阻止你,例如,定義乙個名為seconds的型別和另乙個名為milliseconds的型別,然後意外地將它們新增在一起!在這兩種情況下,c都會高興地看到typedef,看到這兩種型別都是整數,並將它們新增在一起!這當然可能產生無意義的結果。如果您新增5毫秒至10秒,則最終的值為15秒或毫秒。這顯然不是所期望的行為。你可能已經猜到了,我們可以使用另乙個單一的成員結構來給我們乙個typedef單獨的編譯時安全性呢!在下面的示例中,我們可以看到錯誤地新增了毫秒和秒的情況。

typedef uint32_t seconds_t;

typedef uint32_t milliseconds_t;

int main()

我們可以通過做兩件事來提供更多的安全性。首先,不用使用typedef,我們可以將值包裝在乙個結構體中!其次,我們可以定義乙個對我們執行第二次新增的功能。這是我們的擴充套件示例。

struct seconds ;

struct milliseconds ; 

struct seconds add_seconds(struct seconds a, struct seconds b) ;

}int main() ;

struct milliseconds y = ;

// oops!

struct seconds result = add_seconds(x, y); 

printf("seconds: %u\n", result.val);

}在這個例子中,我們將包含在結構中的整數傳遞給乙個負責將它們加在一起的函式。你可能可以說,這個例子不會編譯!當我嘗試構建這個例子時,我的編譯器給了我以下結果:

error: passing 'struct milliseconds' to parameter of incompatible type 'struct seconds'

struct seconds result = add_seconds(x, y);

我們所做的是建立乙個情況,編譯器可以更積極地發現我們的錯誤。 通過攜帶其他結構型別,我們可以幫助減少混合編譯器通常認為可互操作的不同型別時所犯的錯誤。

unity中使用httppost的兩種方式

最近需要在unity中使用http post的方式傳遞訊息,所以做一下記錄吧 1 unity自己的www 方式 因為我傳遞的訊息是json字串所以前期的工作就是 拼字串然後通過litjson或者newtonsoft.json等庫轉換成byte陣列然後,直接上 吧 ienumerator sendto...

在C 結構體中使用靜態資料成員 一

在程式設計時用到了乙個結構體,而該結構體型別的例項還需要連成乙個單向鍊錶,並且需要知道在該鍊錶中包含有多少個節點。很容易想到可以使用 stl中的佇列之類的集合做到這一點,不過由於不是什麼正經專案中要用的 所以就考慮能否在結構體中宣告乙個靜態變數實現對節點的計數功能,因此有了如下 include us...

在VC6 0中使用GDI 的兩種辦法

朱金燦 gdi 是gdi的公升級版本。在vc6.0中並沒有配備gdi 的相關檔案。那麼如何在vc6.0使用gdi 呢?我從網上搜尋了一些資料,並結合自己的使用,總結出一下兩種方法。下面我各建乙個mfc工程介紹這兩種做法。1 找到gdi 庫檔案和標頭檔案,把它放到乙個資料夾gdi files。這個資料...