[英]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.