【发布时间】:2018-09-06 15:37:15
【问题描述】:
我正在寻求创建一个 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
文档和其他问题似乎没有涵盖这种情况。
【问题讨论】:
-
为了记录你为什么需要这个?用例是什么?
-
生成正向表和反向表,以二进制形式硬编码为 AES 256 位加密/解密。 C 版本见github.com/paulej/AESCrypt/blob/…。
-
作为记录,我误解了 C 宏的工作原理。输出是一个 u32 数字,例如
0x7BB0B0CD。但给出的答案仍然告诉我我需要知道的。 -
我也是这么想的,但我懒得去验证 ;) 正如你所说,它不会改变任何东西