1

我看到一些像这样的C代码:

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

我总是喜欢这样:

// B:
typedef uint32_t in_addr;

所以我的问题是:在 A 和 B 中做这件事有什么区别/好处?

4

2 回答 2

4

这是一个引入类型安全的层,它有助于“未来的扩展”。

前者的一个问题是,很容易将 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;

这也将是一个致命的转变。

它只是工具箱中的另一个工具——请自行决定使用。

于 2012-05-02T07:36:56.783 回答
2

贾斯汀的回答基本上是正确的,但我认为需要进行一些扩展:
编辑:贾斯汀大大扩展了他的答案,这使得这个答案有些多余。

类型安全 - 您希望为您的用户提供操作数据的 API 函数,而不是让它仅仅将其视为整数。将字段隐藏在结构中使得以错误的方式使用它变得更加困难,并将用户推向正确的 API。

对于未来的扩展 - 也许未来的实施想要改变一些事情。也许添加一个字段,或者将现有字段分成 4 个字符。使用结构,无需更改 API 即可完成此操作。

有什么好处?如果实现发生变化,您的代码不会中断。

于 2012-05-02T07:41:38.103 回答