【发布时间】:2014-05-28 12:11:28
【问题描述】:
这个问题基本上分为两部分:
您能否将未知标识符传递给Rust 中的宏?
能否在 Rust 宏中组合字符串来生成新的变量名?
例如:
macro_rules! expand(
($x:ident) => (
let mut x_$x = 0;
)
)
调用 expand!(hi) 明显失败,因为 hi 是未知标识符;但你能以某种方式做到这一点吗?
即。 C 中的等价物:
#include <stdio.h>
#define FN(Name, base) \
int x1_##Name = 0 + base; \
int x2_##Name = 2 + base; \
int x3_##Name = 4 + base; \
int x4_##Name = 8 + base; \
int x5_##Name = 16 + base;
int main() {
FN(hello, 10)
printf("%d %d %d %d %d\n", x1_hello, x2_hello, x3_hello, x4_hello, x5_hello);
return 0;
}
你为什么这么说,多么糟糕的想法。你为什么要这样做?
很高兴你问到!
考虑一下这个锈块:
{
let marker = 0;
let borrowed = borrow_with_block_lifetime(data, &marker);
unsafe {
perform_ffi_call(borrowed);
}
}
您现在有了一个没有使用结构生命周期的显式限定生命周期(标记)的借用值,但我们可以保证在 ffi 调用的整个范围内都存在;同时,我们不会遇到晦涩的错误,即 * 在不安全的块内被不安全地取消引用,因此编译器不会将其作为错误捕获,尽管错误是在安全的 阻止。
(另见Why are all my pointers pointing to the same place with to_c_str() in rust?)
使用可以为此目的声明临时变量的宏将大大减轻我与编译器的麻烦。这就是我想这样做的原因。
【问题讨论】: