РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1175 of 1245 menu

Блок 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,
    который указывает линковщику подключаемую библиотеку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить