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

Атрибут #[no_mangle]

Атрибут #[no_mangle] применяется к функциям и статическим переменным для отключения автоматического искажения имён (name mangling), которое обычно выполняет компилятор Rust. Без этого атрибута компилятор изменяет имена символов, добавляя к ним служебную информацию о модуле, типах параметров и других деталях, что делает невозможным их вызов из внешнего кода по исходному имени. Атрибут #[no_mangle] гарантирует, что символ сохранит ровно то имя, которое указано в исходном коде. Параметров атрибут не принимает.

Использование #[no_mangle] часто требуется совместно с extern "C" для обеспечения совместимости с C ABI, а также при экспорте функций из динамических библиотек.

Синтаксис

#[no_mangle] fn function_name() { // body }

Пример

Давайте объявим функцию с атрибутом #[no_mangle] и вызовем её из обычного кода Rust:

#[no_mangle] fn my_function() { println!("Hello from my_function"); } fn main() { my_function(); }

Результат выполнения кода:

"Hello from my_function"

Пример

Давайте посмотрим, как выглядит функция без атрибута #[no_mangle] при экспорте в C:

#[no_mangle] pub extern "C" fn add_numbers(a: i32, b: i32) -> i32 { a + b } fn main() { let res = add_numbers(2, 3); println!("{}", res); }

Результат выполнения кода:

5

Пример

Давайте применим #[no_mangle] к статической переменной и выведем её значение:

#[no_mangle] pub static GLOBAL_VALUE: i32 = 42; fn main() { println!("{}", GLOBAL_VALUE); }

Результат выполнения кода:

42

Смотрите также

  • атрибут extern "C",
    который задаёт C ABI для функции
  • атрибут repr(C),
    который задаёт C-совместимое представление структуры
  • атрибут link,
    который связывает внешнюю библиотеку с программой
  • ключевое слово unsafe fn,
    которое объявляет небезопасную функцию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить