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
似乎不太合适。
我的问题是:这样做的最佳做法应该是什么?
在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 内核编程。
对于用户空间应用程序,建议的方法可能被视为不好的做法,或者根本就是错误的。