C - 将 void* 转换为 int 内核的最佳实践

C - best practice for casting a void* to int, kernel

我正在为 Linux 内核编写一个模块,我想在文件私有数据中存储一个 int 值。

本质上,我所做的是:file->private_data = (void*) x 其中 x 是一些 int 值。

现在,我想将 int 作为值访问回来。

使用int val = (int) file->private_data在编译过程中给出cast from pointer to integer of different size警告,这是合理的,因为它可能会导致64位系统出现问题。

我也无法使用 uintptr_t,因为我在内核中工作,我无法访问库。

使用 double 似乎不合适。

我的问题是:这样做的最佳做法应该是什么?

在gcc世界中(Linux内核是由gcc编译的),long(或unsigned long)与指针大小相同。将指针转换为整数并返回时,您可以使用此功能:

// store
file->private_data = (void*)(long) x;
// load
int val = (int) (long) file->private_data;

注意:这个答案专门针对 Linux 内核 编程。

对于用户-space应用程序,建议的方法可以被视为不良做法,或者只是错误.

能否详细说明一下,您是如何陷入合理存储 int 的境地的?

通常这是一个指向引用计数对象的指针。特别是,如果您使用它来查找另一个对象,那么这个字段可能应该只指向该对象。