无法将参数转发到嵌套宏

时间:2015-05-22 14:46:57

标签: macros rust

我正在使用Rust宏来生成描述FFI回调的静态结构数组。我现在拥有的是......

// some trivial callback functions
extern "C" fn my_fun_1(argc: u32, argv: *const i32) -> i32 { 1 }
extern "C" fn my_fun_2(argc: u32, argv: *const i32) -> i32 { 2 }


// create static array of ErlNifFunc describing above callbacks
nif_init!(b"my_module\0", 
    nif!(b"my_fun_1\0", 3, my_fun_1),
    nif!(b"my_fun_2\0", 5, my_fun_2));

(整件事是here

这是有效的,因为我只需要提供一个对nif!宏提供的信息的扩展。但是现在,除了生成结构数组之外,我还想为所提供的函数生成包装器函数。因此,我无法立即调用nif!,因为我现在需要对基础参数执行多次扩展传递。我实际上需要在nif!内移动nif_init!次调用,这就是我淹死的地方。我认为顶级nif_init!需要看起来像这样......

nif_init!(b"my_module\0", 
    (b"my_fun_1\0", 3, my_fun_1),
    (b"my_fun_2\0", 5, my_fun_2));

...将内部括号参数传递给子宏,但我不能让它去。完全不起作用的是here。为了澄清,这个版本只是尝试在内部进行宏调用。我还没有尝试生成任何包装函数。

1 个答案:

答案 0 :(得分:4)

对于这种情况,您不能使用括号作为分组,您需要将它们用作宏模式的一部分。我避免使用parens来避免这种混淆。

在这里,我稍微改变了你的宏以接受零或多组{}。你可以对每个宏进行宏迭代并调用内部宏:

macro_rules! nif_inner {
    ($name:expr, $args:expr, $meth:expr) => ()
}

macro_rules! nif_init {
    ($module:expr, $({ $name:expr, $args:expr, $meth:expr }),*) => (
        $(nif_inner!(name, $args, $meth);)*
    )
}

nif_init!(
    "hello",
    { "name1", 1, true },
    { "name2", 2, false }
);

fn main() {}