Macros Rust宏可以像十六进制数的C预处理器宏那样扩展吗?
我希望创建一个Rust宏,它可以实现C中的功能Macros Rust宏可以像十六进制数的C预处理器宏那样扩展吗?,macros,rust,expansion,Macros,Rust,Expansion,我希望创建一个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 ) } 产
#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)
}
}
macro\u规则!gen_hex_num{
($a:expr,$b:expr,$c:expr,$d:expr)=>{
($a用于记录为什么需要它?用例是什么?生成正向表和反向表以二进制形式硬编码为AES 256位加密/解密。请参阅C版本。对于记录,我对C宏的工作方式有误解。输出是u32数字,如0x7BB0CD
。但给出的答案仍然是sh。)告诉我我需要知道的。我也这么想,但我太懒了,无法验证;)正如你所说的,它不会改变任何东西。我会把数字文字放在前面;可读性是我能看到的在C中使用宏的唯一原因。实际上,它需要的远远不止是可读性。在abcd、dabc、cdab和bcda中,十六进制的for部分有四种模式。然后,这些顺序中的每一种都用于生成正向和反向相反的表格。因此,上面的数字0x7BB0CD
是abcd
形式,0xCD7BB0CD
将是dabc
模式。我在这里创建了一个代码示例,用于生成四个变体中每个变体的十六进制宏,以及另一个只使用宏名$mc的十六进制数宏ro:ident
为每个表的所有256个十六进制数调用的4个宏中的任何一个。