Rust过程宏使用u32_suffixed为何报期望isize类型错误
为什么使用
Literal::u32_suffixed生成字面量会触发编译错误 核心原因和Rust枚举判别值的类型规则直接相关:
- 没有添加
#[repr(...)]布局标注的普通枚举,判别值的默认类型固定为isize,所有显式写在定义里的判别值表达式,都必须符合这个类型约束。 Literal::u32_unsuffixed(count)生成的是不带任何类型后缀的整数字面量,展开后就是1、2这类形式。无后缀整数字面量本身没有绑定固定类型,在枚举判别值的位置会自动适配上下文要求的isize类型,只要数值在合法范围内就能正常编译。Literal::u32_suffixed(count)生成的是带u32类型后缀的整数字面量,展开后等价于1u32、2u32。带类型后缀的字面量会被编译器明确识别为后缀对应的类型,Rust不会对这类显式标注类型的值做隐式类型转换,自然和默认要求的isize类型不匹配,抛出E0308类型不匹配的编译错误。
这个行为是Rust的刻意设计:类型后缀本身就是用来显式指定值类型的语法,编译器不会为这类值做隐式适配,从根源避免意外类型转换带来的问题。
如果确实需要用u32作为枚举判别值类型,可以在枚举定义上添加#[repr(u32)]布局标注,让编译器以u32为基准校验判别值类型,这时候再用u32_suffixed生成字面量就不会报错。如果不需要修改枚举的内存布局,直接使用无后缀整数字面量,或者改用Literal::isize_suffixed(count)生成带isize后缀的字面量,也能正常通过编译。
内容的提问来源于stack exchange,提问作者boundless-forest
相关产品推荐
相关产品推荐

