Macros 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 ) } 产

我希望创建一个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)
    }
}
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个宏中的任何一个。