我看到一些像这样的C代码:
// A:
typedef uint32_t in_addr_t;
struct in_addr { in_addr_t s_addr; };
我总是喜欢这样:
// B:
typedef uint32_t in_addr;
所以我的问题是:在 A 和 B 中做这件事有什么区别/好处?
这是一个引入类型安全的层,它有助于“未来的扩展”。
前者的一个问题是,很容易将 typedefed 内置函数表示的类型的值“转换”为其他几种类型或 typedefed 内置函数中的任何一种。
考虑:
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 ints,这是一个有效的程序。使用结构,它的格式不正确——编译器错误需要您进行更正,您可以明确表达您的意图。
使用 typedef,可以应用任意算术和转换,并且它们可以在没有警告的情况下相互分配,这可能成为维护的负担。
还要考虑:
t_second s = millisecond;
这也将是一个致命的转变。
它只是工具箱中的另一个工具——请自行决定使用。
贾斯汀的回答基本上是正确的,但我认为需要进行一些扩展:
编辑:贾斯汀大大扩展了他的答案,这使得这个答案有些多余。
类型安全 - 您希望为您的用户提供操作数据的 API 函数,而不是让它仅仅将其视为整数。将字段隐藏在结构中使得以错误的方式使用它变得更加困难,并将用户推向正确的 API。
对于未来的扩展 - 也许未来的实施想要改变一些事情。也许添加一个字段,或者将现有字段分成 4 个字符。使用结构,无需更改 API 即可完成此操作。
你有什么好处?如果实现发生变化,您的代码不会中断。