来自Linux源代码的types.h文件的示例
typedef __kernel_timer_t timer_t;
typedef __kernel_key_t key_t;
typedef __kernel_timer_t timer_t;
它们都是typedef
int
(数据类型)。 Linux包含很多typedef
简单数据类型,如long
,int
等。他们是否有任何具体原因?
答案 0 :(得分:3)
有几个因素浮现在脑海中:
linux支持许多不同的平台和体系结构,并且可能有意义的是允许某些数据类型在不同的环境中浮动到不同的大小 - 例如,为了提高效率。然后,typedef允许基本类型在不同的体系结构上变化 - 通常包括特定于平台的标头。
另一方面,某些关键数据类型可能需要它们实际上具有指定长度(对于持久/共享数据结构或仅保证值的范围)但实际上可能要求在不同的体系结构上使用不同的基本类型声明它们。 (请注意,除少数例外情况外,C语言标准不保证各种数字类型的特定长度。)
为了构建系统调用绑定,必须可以将许多内核的数据类型规范导出到glibc(或其他libc实现),以便可以将用户空间值可靠地传递给系统调用。
内核中名为key_t
的类型(例如)可能已用于用户空间代码中的某些其他数据类型。因此,使用__kernel_key_t
允许类型不同,即使在使用key_t
的另一个概念但没有任何歧义的代码中可能需要它。
typedef的附加层允许处理所有这些问题,同时不会因为内核开发人员始终键入__kernel_XXX_t
而过度负担。