Как «extern» функцию в нескольких модулях с одинаковым именем? - PullRequest
0 голосов
/ 31 января 2019

У меня есть проект lib с несколькими модулями one и two в отдельных файлах.Каждый модуль имеет функцию с именем 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 голосов
/ 31 января 2019

Нет, вы не можете дать нескольким вещам одно и то же имя в глобальном пространстве имен.Это своего рода определение того, что такое имя и пространство имен.Вам нужно будет экспортировать их как два разных имени.

Я предпочитаю иметь одно местоположение, которое экспортирует вещи, чтобы их было легче увидеть и предотвратить столкновения.Кроме того, ваши символы должны быть уникальными среди всех библиотек, которые когда-либо будут связаны с вашей библиотекой.Вот почему большинство высококачественных проектов на языке Си используют имя библиотеки в каждом открытом методе.

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();
}

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...