Rust 宏可以像 C 预处理器宏一样扩展为十六进制数吗?
Can Rust macros expand like C preprocessor macros for hex numbers?
我希望创建一个 Rust 宏,它可以在 C 中执行此操作。
#define V(a,b,c,d) 0x##a##b##c##d
调用时:
V(7B,B0,B0,CB)
将在编译时将以下十六进制数简单地放入代码中:
0x7BaB0bB0cCDd
尝试这样的事情:
macro_rules! gen_hex_num {
($a:expr , $b:expr , $c:expr , $d:expr) => (
0x($a)a($b)b($c)c($d)d
)
}
产生错误:
error: macro expansion ignores token `a` and any following
--> src/main.rs:3:16
|
3 | 0x($a)a($b)b($c)c($d)d
| ^
|
note: caused by the macro expansion here; the usage of `gen_hex_num!` is
likely invalid in expression context
文档和其他问题似乎没有涵盖这种情况。
没有。
Rust 宏只能处理和生成整个令牌,不能处理和生成令牌片段。 7b
之类的东西不是标记,因此您将无法编写匹配它的宏。
似乎在C中使用这个宏的主要原因是为了让数字更易读。这在 Rust 中并不是真正必要的,因为数字文字中允许使用下划线。所以你可以只写 0x7b_b0_b0_cb
来代替。
您可以通过接受数字并进行数学运算来近似原始宏,如下所示:
macro_rules! gen_hex_num {
($a:expr, $b:expr, $c:expr, $d:expr) => {
($a << 24) | ($b << 16) | ($c << 8) | ($d)
}
}
但你必须像 gen_hex_num!(0x7B, 0xB0, 0xB0, 0xCB)
那样称呼它,这可能会破坏目的。
我希望创建一个 Rust 宏,它可以在 C 中执行此操作。
#define V(a,b,c,d) 0x##a##b##c##d
调用时:
V(7B,B0,B0,CB)
将在编译时将以下十六进制数简单地放入代码中:
0x7BaB0bB0cCDd
尝试这样的事情:
macro_rules! gen_hex_num {
($a:expr , $b:expr , $c:expr , $d:expr) => (
0x($a)a($b)b($c)c($d)d
)
}
产生错误:
error: macro expansion ignores token `a` and any following
--> src/main.rs:3:16
|
3 | 0x($a)a($b)b($c)c($d)d
| ^
|
note: caused by the macro expansion here; the usage of `gen_hex_num!` is
likely invalid in expression context
文档和其他问题似乎没有涵盖这种情况。
没有。
Rust 宏只能处理和生成整个令牌,不能处理和生成令牌片段。 7b
之类的东西不是标记,因此您将无法编写匹配它的宏。
似乎在C中使用这个宏的主要原因是为了让数字更易读。这在 Rust 中并不是真正必要的,因为数字文字中允许使用下划线。所以你可以只写 0x7b_b0_b0_cb
来代替。
您可以通过接受数字并进行数学运算来近似原始宏,如下所示:
macro_rules! gen_hex_num {
($a:expr, $b:expr, $c:expr, $d:expr) => {
($a << 24) | ($b << 16) | ($c << 8) | ($d)
}
}
但你必须像 gen_hex_num!(0x7B, 0xB0, 0xB0, 0xCB)
那样称呼它,这可能会破坏目的。