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 的境地的?
通常这是一个指向引用计数对象的指针。特别是,如果您使用它来查找另一个对象,那么这个字段可能应该只指向该对象。
我正在为 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 的境地的?
通常这是一个指向引用计数对象的指针。特别是,如果您使用它来查找另一个对象,那么这个字段可能应该只指向该对象。