所以我远不是C方面的专家,但是我读了很长时间的代码中有一些东西一直困扰着我:有人能解释一下为什么C(++)程序员使用typedefs来重命名简单类型吗?我理解您为什么要将它们用于 struct ,但是我看到的声明的确切原因是什么

typedef unsigned char uch;
typedef uch UBYTE;
typedef unsigned long ulg;
typedef unsigned int u32;
typedef signed short s16;

这是否有一些我不清楚的优势(作为一个程序员,他的经验从Java开始,并没有在严格的类型安全语言之外冒险)?因为我想不出任何理由——它看起来只会让不熟悉该项目的人看不懂代码.

别客气,把我当成C级新手吧,老实说,我对它知之甚少,很可能从一开始我就误解了一些事情

推荐答案

重命名类型而不更改其公开的语义/特征没有多大意义.在你的例子中

typedef unsigned char uch;
typedef unsigned long ulg;

属于那个类别.除了取个更短的名字,我不明白这有什么意义.

但是这些

typedef uch UBYTE;
typedef unsigned int u32;
typedef signed short s16;

是一个完全不同的故事.例如,s16代表"带符号的16位类型".此类型不一定是signed short.哪种特定类型将隐藏在s16后面取决于平台.程序员引入了这种额外的命名间接级别,以简化对多平台的支持.如果在其他平台上签名的16位类型恰好是signed int,程序员将只需更改一个类型定义.UBYTE显然代表无符号机器字节类型,不一定是unsigned char.

值得注意的是,C99规范已经为特定宽度的整数类型提供了标准命名,如int16_tuint32_t等.在不支持C99的平台上坚持这个标准命名约定可能更有意义.

C++相关问答推荐

C中的整字母后缀i是什么

是否可以在C中进行D3 D12申请?

有效地计算由一组点构成的等边三角形和等腰三角形的数量

为什么内核使用扩展到前后相同的宏定义?

从纯C中访问通用项对话框

LONG_DOUBLE_T是否存在(标准C:C23)

在 struct 中强制转换空指针

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

如何使用C++在控制台中以彩色打印被阻止的客户端

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

OSDev--双缓冲重启系统

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

问题:C#Define上的初始值设定项元素不是常量

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

C中的数组下标和指针算法给出了不同的结果

C:面筋蛋白';为什么不刷新窗口?

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

在C中定义函数指针?

多行表达式:C 编译器如何处理换行符?