内核中一些通常使用的数据类型有它们自己的 typedef 语句, 因此阻止了任何移植性问 题. 例如, 一个进程标识符 ( pid ) 常常是 pid_t 而不是 int. 使用 pid_t 屏蔽了任 何在实际数据类型上的不同. 我们使用接口特定的表达式来指一个类型, 由一个库定义的, 以便于提供一个接口给一个特定的数据结构.
注意, 在近期, 已经相对少定义新的接口特定类型. 使用 typedef 语句已经有许多内核 开发者不喜欢, 它们宁愿看到代码中直接使用的真实类型信息, 不是藏在一个用户定义的 类型后面. 很多老的接口特定的类型在内核中保留, 但是, 并且它们不会很快消失.
甚至当没有定义接口特定的类型, 以和内核其他部分保持一致的方式使用正确的数据类型 是一直重要的. 一个嘀哒计数, 例如, 一直是 unsigned long, 独立于它实际的大小, 因 此 unsigned long 类型应当在使用 jiffy 时一直使用. 本节我们集中于 _t 类型的使用.
很多 _t 类型在 <linux/types.h> 中定义, 但是列出来是很少有用. 当你需要一个特定 类型, 你会在你需要调用的函数的原型中发现它, 或者在你使用的数据结构中.
无论何时你的驱动使用需要这样"定制"类型的函数并且你不遵照惯例, 编译器发出一个警 告; 如果你使用 -Wall 编译器标志并且小心去除所有的警告, 你能有信心你的代码是可 移植的.
_t 数据项的主要问题是当你需要打印它们时, 常常不容易选择正确的 printk 或 printf 格式, 你在一个体系上出现的警告会在另一个上重新出现. 例如, 你如何打印一个 size_t, 它在一些平台上是 unsigned long 而在其他某个上面是 unsigned int?
无论何时你需要打印某个接口特定的数据, 最好的方法是转换它的值为最大的可能类型 (常常是 long 或者 unsigned long ) 并且接着打印它通过对应的格式. 这种调整不会产 生错误或者警告, 因为格式匹配类型, 并且你不会丢失数据位, 因为这个转换或者是一个 空操作或者是数据项向更大数据类型的扩展.
实际上, 我们在谈论的数据项不会常常要打印的, 因此这个问题只适用于调试信息. 常常, 代码只需要存储和比较接口特定的类型, 加上传递它们作为给库或者内核函数的参数.
尽管 _t 类型是大部分情况的正确解决方法, 有时正确的类型不存取. 这发生在某些还未 被清理的老接口.
我们在内核头文件中发现的一个模糊之处是用在 I/O 函数的数据类型, 它松散地定义
松散的类型在那里主要是因为历史原因, 但是在写代 码时它可能产生问题. 例如, 交换给函数如 outb 的参数可能会有麻烦; 如果有一个 port_t 类型, 编译器会发现这个类型.
原文地址:https://www.cnblogs.com/fanweisheng/p/11146085.html