Rust如何不使用unsafe将u32常量转换为i32常量
方案1:Rust 1.63及以上版本直接用安全常量转换
从Rust 1.63版本开始,整数的TryFrom转换已经支持常量上下文,你注释中尝试的写法现在可以直接编译,全程安全无unsafe:
const ERROR_NO_MORE_FILES_I32: i32 = i32::try_from(ERROR_NO_MORE_FILES).unwrap();
编译期会自动校验数值范围,如果u32常量超出i32的合法范围会直接报错,没有运行时风险。
方案2:兼容旧版本Rust的无unsafe写法
如果你需要兼容更低版本的Rust,完全可以直接用as转换,不需要加unsafe块:
const ERROR_NO_MORE_FILES_I32: i32 = ERROR_NO_MORE_FILES as i32;
这里不需要unsafe的原因很简单:Windows系统错误码的取值范围固定为0~0x7FFFFFFF,天然落在i32的非负合法范围内,这种场景下u32转i32的as转换行为是明确定义的,不会产生任何未定义行为,你原来代码里的unsafe属于多余添加。
方案3:无需额外定义常量的简化写法
你甚至可以不用单独声明i32版本的常量,直接在match分支做转换即可,全版本兼容且安全:
use std::io::Error; const ERROR_NO_MORE_FILES: u32 = 18; fn main() -> Result<(), Error> { let err = Error::last_os_error(); match err.raw_os_error() { Some(code) if code == ERROR_NO_MORE_FILES as i32 => println!("No more files..."), Some(_) => return Err(err), _ => {} } Ok(()) }
内容的提问来源于stack exchange,提问作者blep
相关产品推荐
相关产品推荐

