簡體   English   中英

在C語言中僅將一個基本字段封裝到一個結構中有什么好處?

[英]What's the benefit of encapsulating only one basic field into a struct in C?

我看到了一些這樣的C代碼:

// A:
typedef uint32_t in_addr_t;
struct in_addr { in_addr_t s_addr; };

我一直喜歡這樣:

// B:
typedef uint32_t in_addr;

所以我的問題是:在A和B之間進行操作有什么區別/好處?

這是介紹類型安全性的一層,它對“將來的擴展”很有幫助。

前者的一個問題是,很容易將類型定義內建表示的類型的值“轉換”為其他幾種類型或類型定義內建中的任何一個。

考慮:

typedef int t_millisecond;
typedef int t_second;
typedef int t_degrees;

與:

// field notation could vary greatly here:
struct t_millisecond { int ms; };
struct t_second { int s; };
struct t_degrees { int f; };

在某些情況下,使用記號會更清楚一些,並且編譯器還將禁止錯誤的轉換。 考慮:

int a = millsecond * second - degree;

這是一個可疑程序。 使用typedefed int,這是一個有效的程序。 使用結構是錯誤的格式-編譯器錯誤將需要更正,並且您可以使意圖明確。

使用typedef,可以應用任意算術和轉換,並且可以在沒有警告的情況下將它們彼此分配,這可能成為維護的負擔。

還請考慮:

t_second s = millisecond;

這也將是致命的轉換。

它只是工具箱中的另一個工具-可以隨意使用。

賈斯汀的回答本質上是正確的,但我認為需要一些擴展:
編輯:賈斯汀大大擴展了他的答案,這使這有點多余。

類型安全性-您想為用戶提供操作數據的API函數,而不是讓其僅將其視為整數。 將字段隱藏在結構中會使使用錯誤的方式變得更加困難,並且將用戶推向正確的API。

對於將來的擴展-也許將來的實現可能希望改變事情。 也許添加一個字段,或將現有字段分成4個字符。 使用結構,無需更改API即可完成此操作。

叫什么好處? 如果實現發生更改,您的代碼將不會中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM