所以我远远不是C的专家,但有些东西一直困扰着我很长一段时间阅读的代码:有人可以向我解释为什么C(++)程序员使用typedef重命名简单类型吗?我理解为什么你会将它们用于结构体,但究竟是什么原因让我看到了声明
typedef unsigned char uch;
typedef uch UBYTE;
typedef unsigned long ulg;
typedef unsigned int u32;
typedef signed short s16;
Run Code Online (Sandbox Code Playgroud)
这对我来说是否有一些优势(一个程序员,他的经验始于Java并且没有在严格的类型安全语言之外进行过远)?因为我无法想到它的任何原因 - 看起来它只会使代码对于不熟悉项目的人来说不那么可读.
随意像对待C新手一样对待我,老实说我对此知之甚少,而且很可能从一开始我就误解了.;)
AnT*_*AnT 78
重命名类型而不改变其暴露的语义/特征没有多大意义.在你的例子中
typedef unsigned char uch;
typedef unsigned long ulg;
Run Code Online (Sandbox Code Playgroud)
属于那个类别.除了简短的名字外,我没有看到这一点.
但是这些
typedef uch UBYTE;
typedef unsigned int u32;
typedef signed short s16;
Run Code Online (Sandbox Code Playgroud)
是一个完全不同的故事.例如,s16代表"带符号的16位类型".这种类型不一定signed short.隐藏的特定类型s16取决于平台.程序员引入了这种额外级别的命名间接,以简化对多个平台的支持.如果在某些其他平台上签名的16位类型恰好是signed int,程序员只需要更改一个typedef定义.UBYTE显然代表一个未签名的机器字节类型,这不一定unsigned char.
值得注意的是,C99规范已经为特定宽度的整体类型提供了标准命名法,例如int16_t,uint32_t等等.在不支持C99的平台上坚持使用这种标准命名约定可能更有意义.
sha*_*oth 14
这允许便携性.例如,您需要一个无符号的32位整数类型.这是哪种标准类型?你不知道 - 它是实现定义的.这就是为什么你将typedef一个单独的类型作为32位无符号整数并在代码中使用新类型的原因.当您需要在另一个C实现上编译时,您只需更改typedefs.
有时它被用来减少笨重的东西,比如volatile unsigned long更紧凑的东西,比如vuint32_t.
其他时候它是为了帮助提高可移植性,因为类似int的类型在每个平台上并不总是相同.通过使用typedef,您可以将您感兴趣的存储类设置为平台最接近的匹配,而无需更改所有源代码.