繁体   English   中英

C-将void *转换为int,kernel的最佳实践

[英]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内核编程。

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

您能详细说明一下如何将自己存储在合理的位置吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM