我试图让一些较旧的Rust代码进行编译,以及这段代码:
const SOMETHING: *const c_char = -1 as *const c_char;
我收到此错误:
error: cannot apply unary operator `-` to type `usize`
--> src/lib.rs:32:34
|
32 | const SOMETHING: *const c_char = -1 as *const c_char;
|
我怀疑这是因为c_char
未签名且未签名不能为负,但我不知道如何修复它。此代码适用于一些未知的旧版Rust。我尝试将c_char
改为i8
只是为了好玩而且没有用。
答案 0 :(得分:9)
指针对象的类型无关紧要。当你将一个整数强制转换为指针时,Rust会推断整数必须是usize
,因为它是唯一的类型(除isize
之外,虽然它不经常使用)但保证具有相同的类型大小作为指针。
实际上,在Rust中,一元否定运算符不再适用于无符号整数类型。相反,您应该使用按位非运算符(在{C}中写为!
,而不是~
。)
在二进制补码二进制中,这两个运算符之间有一个直接的等价:!x == -(x + 1)
。具体而言,-1
的等效值为!0
。因此,你可以写:
const SOMETHING: *const c_char = !0 as *const c_char;
答案 1 :(得分:6)
如果你真的想设置一个指向$
的指针,你可以,你只需要明确表示积分值是-1
,而不是isize
:
usize
您还可以说它是const SOMETHING: *const c_char = -1_isize as *const c_char;
的最大值:
usize
这两个结果都相同:
const SOMETHING: *const c_char = std::usize::MAX as *const c_char;
打印:
extern crate libc;
use libc::c_char;
const SOMETHING1: *const c_char = -1_isize as *const c_char;
const SOMETHING2: *const c_char = std::usize::MAX as *const c_char;
fn main() {
println!("{:p}", SOMETHING1);
println!("{:p}", SOMETHING2);
}