我正在为 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 内核编程。
对于用户空间应用程序,建议的方法可能被视为一种不好的做法,或者只是错误。
你能详细说明一下你为什么会陷入在那里存储 int 是合理的情况吗?
通常,这将是指向引用计数对象的指针。特别是,如果你使用它来查找另一个对象,这个字段可能应该只指向那个对象。