Блок extern
Блок extern позволяет объявить функции и статические
переменные, которые определены вне текущего крейта Rust.
Чаще всего он применяется для связи с кодом на языке C
или с системными библиотеками. Внутри блока указывается
ABI (application binary interface), например "C",
а затем перечисляются сигнатуры внешних функций без тела.
Вызов таких функций возможен только внутри блока
unsafe, так как компилятор не может гарантировать
их безопасность.
Синтаксис
extern "ABI"
{
fn function_name(parameters) -> return_type;
static VARIABLE: type;
}
Пример
Объявим внешнюю функцию abs из стандартной
библиотеки C и вызовем её внутри блока unsafe:
extern "C"
{
fn abs(input: i32) -> i32;
}
fn main()
{
let res = unsafe { abs(-5) };
println!("{}", res);
}
Результат выполнения кода:
5
Пример
Объявим внешнюю функцию strlen для подсчёта длины
C-строки и применим её к указателю на байтовую строку:
use std::os::raw::c_char;
extern "C"
{
fn strlen(s: *const c_char) -> usize;
}
fn main()
{
let s = b"abcde\0";
let res = unsafe { strlen(s.as_ptr() as *const c_char) };
println!("{}", res);
}
Результат выполнения кода:
5
Смотрите также
-
ключевое слово
extern "C",
которое задаёт C-совместимый ABI для внешних функций -
ключевое слово
unsafe,
которое открывает блок для вызова небезопасного кода -
атрибут
no_mangle,
который запрещает искажение имён функций -
атрибут
link,
который указывает линковщику подключаемую библиотеку