What is the meaning of #[no_mangle]
2023年12月14日大约 2 分钟
What is the meaning of #[no_mangle]
这段 Rust 代码定义了一个可以从 C 语言或其他使用 C ABI (Application Binary Interface) 的语言调用的函数。让我们逐部分解释它:
#[no_mangle]
#[no_mangle]
是一个编译器指令(attribute),用于告诉 Rust 编译器不要改变这个函数的名字。- 正常情况下,Rust 编译器会对函数名进行修改(称为“mangling”),以支持特性如函数重载等。但是,这会使得使用 C 语言等其他语言很难或无法找到和链接到这个函数。
- 使用
#[no_mangle]
可确保函数名在编译后的二进制文件中保持不变,使得其他语言可以通过这个确切的名字来调用该函数。
pub extern "C"
pub
表明这个函数是公开的,意味着它可以被同一程序中的其他 Rust 代码或者其他语言的代码调用。extern "C"
表示这个函数应该使用 C 语言的调用约定(calling convention)。这对于确保从其他语言(特别是 C 语言)正确调用此函数非常重要。- C 语言调用约定定义了如何传递参数、如何处理栈、如何返回值等,这对于跨语言的函数调用是必需的。
函数定义
fn hello_from_rust() {
println!("Hello from Rust!");
}
- 这部分定义了函数的具体行为。当这个函数被调用时,它会执行
println!
宏,输出字符串 "Hello from Rust!" 到控制台。
使用场景
- 这样的函数定义常用于创建可以被 C 语言或其他使用 C ABI 的语言调用的 Rust 库。
- 例如,你可能有一个用 Rust 编写的库,你希望它能够被 C 语言编写的程序使用。通过这种方式定义函数,C 程序就可以链接并调用这个 Rust 函数。
总结
通过组合使用 #[no_mangle]
和 extern "C"
,这段代码定义了一个可以从 C 语言环境安全调用的 Rust 函数,同时保证了函数名在编译过程中不会被更改。这是 Rust 与其他语言(特别是 C 语言)互操作时的一种常见模式。