Атрибут #[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,
которое объявляет небезопасную функцию