如何在多个具有相同名称的模块中“替代”一个功能?

时间:2019-01-31 08:35:10

标签: rust webassembly

我有一个lib项目,在单独的文件中有多个分别名为onetwo的模块。每个模块都有一个名为run的功能:

mod one {
    pub fn run() {
        println!("One");
    }
}

mod two {
    pub fn run() {
        println!("Two");
    }
}

fn main() {
    one::run();
    two::run();
}

Playground

我想将每个文件/函数编译为WebAssembly,然后能够加载它们并调用函数run()

我相信我必须添加#[no_mangle]指令并将其标记为extern "C"函数。当我这样做时,尽管模块结构不同,但run函数上却存在名称冲突。

这是无法编译的修改版本:

mod one {
    #[no_mangle]
    pub extern "C" fn run() {
        println!("One");
    }
}

mod two {
    #[no_mangle]
    pub extern "C" fn run() {
        println!("Two");
    }
}

fn main() {
    one::run();
    two::run();
}

Playground

是否可以在项目中具有多个模块,每个模块具有相同名称的功能,这样我就可以将具有功能的文件编译为WebAssembly,并保留功能名称?

1 个答案:

答案 0 :(得分:2)

否,您不能在全局名称空间中为多个事物赋予相同的名称。这就是名称和名称空间的定义。您需要将它们导出为两个不同的名称。

我更喜欢使用一个可以导出内容的位置,这样可以更轻松地查看和防止冲突。此外,在与您的库链接的所有库中,您的符号应该唯一。这就是为什么大多数高质量C项目在每种公共方法中都使用库名的原因。

mod one {
    pub fn run() {
        println!("One");
    }
}

mod two {
    pub fn run() {
        println!("Two");
    }
}

#[no_mangle]
pub extern "C" fn mylib_one_run() {
    one::run()
}

#[no_mangle]
pub extern "C" fn mylib_two_run() {
    two::run()
}

fn main() {
    one::run();
    two::run();
}

另请参阅: