我正在编写一个使用导出符号 open_exec
struct file *open_exec(const char *name)
它返回一个指针,我可以使用 IS_ERR
宏检查错误:
if (IS_ERR(file))
return file;
在编译期间,我收到此警告:
warning: return makes integer from pointer without a cast
这是因为我的函数在这里返回一个整数。如果我尝试转换它:
return (int) file;
我在 32 位机器上没有收到警告,但在 64 位机器上收到警告:
warning: cast from pointer to integer of different size
这是因为 int 和指针的 sizeof
在 32 位机器上相同,但在 64 位机器上不同。
不管是否强制转换,代码似乎都有效。我只想去掉警告。
我如何正确地将指针转换为整数并获得我期望的值,同时不会收到编译器警告?我期望的值本质上是一个整数,列在 linux 内核代码库的 include/asm-generic/errno-base.h
中。
因为在 IS_ERR()
为 true 的情况下,我只将指针视为一个整数,所以我可以确定它实际上只包含一个整数值.
最佳答案
linux/err.h
中的 PTR_ERR()
宏也定义了 IS_ERR()
,它将一个指针转换为实际上是将错误代码转换为适当的类型(long
)。
你应该使用类似的东西:
if (IS_ERR(file))
return PTR_ERR(file);
在源代码中搜索 PTR_ERR()
的现有用法,您会发现这是一种常见模式。
您的函数返回 long
而不是 int
可能更合适 - 但所有错误代码都应该可以用 int
表示.
关于在 64 位 arch 上转换一个指向整数的问题警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6825640/