如何根据 Rust 中的编译标志制作类型别名?
How to make type aliases based on compile flags in Rust?
我想默认将类型 uint
别名为 u32
,但可以在编译期间设置标志以将其更改为 usize
。代码应该是这样的:
#[cfg(uint='u32') || default]
type uint = u32;
#[cfg(uint='usize')]
type uint = u64;
而且我编译的时候可以用cargo build --uint=usize
。我应该怎么做才能完成这项工作?
您需要的功能不存在。有几种方法可以伪造它。
首先,您可以使用以下功能:
#[cfg(all(feature="uint-is-u16", not(any(feature="uint-is-u32", feature="uint-is-u64"))))]
type uint = u16;
#[cfg(not(any(feature="uint-is-u16", feature="uint-is-u64")))]
type uint = u32;
#[cfg(all(feature="uint-is-u64", not(any(feature="uint-is-u16"))))]
type uint = u64;
这些是使用 cargo build --features=uint-is-u64
指定的。请注意,特征是 严格地 加性的,而你 不能 制作 "exclusive" 特征:即 你无法同时指定 u64
和 u32
。因此,您需要构建代码,使其即使在启用多个功能的情况下也能正常工作。
或者,您可以将设置放在某个配置文件中,然后写一个 build script that emits the type alias as code (see the code generation example).
我想默认将类型 uint
别名为 u32
,但可以在编译期间设置标志以将其更改为 usize
。代码应该是这样的:
#[cfg(uint='u32') || default]
type uint = u32;
#[cfg(uint='usize')]
type uint = u64;
而且我编译的时候可以用cargo build --uint=usize
。我应该怎么做才能完成这项工作?
您需要的功能不存在。有几种方法可以伪造它。
首先,您可以使用以下功能:
#[cfg(all(feature="uint-is-u16", not(any(feature="uint-is-u32", feature="uint-is-u64"))))]
type uint = u16;
#[cfg(not(any(feature="uint-is-u16", feature="uint-is-u64")))]
type uint = u32;
#[cfg(all(feature="uint-is-u64", not(any(feature="uint-is-u16"))))]
type uint = u64;
这些是使用 cargo build --features=uint-is-u64
指定的。请注意,特征是 严格地 加性的,而你 不能 制作 "exclusive" 特征:即 你无法同时指定 u64
和 u32
。因此,您需要构建代码,使其即使在启用多个功能的情况下也能正常工作。
或者,您可以将设置放在某个配置文件中,然后写一个 build script that emits the type alias as code (see the code generation example).