繁体   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