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

Mic*_*key 3 c int casting void-pointers linux-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似乎不太合适。

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

Tsy*_*rev 5

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

// store
file->private_data = (void*)(long) x;
// load
int val = (int) (long) file->private_data;
Run Code Online (Sandbox Code Playgroud)

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

对于用户空间应用程序,建议的方法可能被视为不好的做法,或者根本就是错误的