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



我正在为 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 是合理的情况吗?

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

最新更新