对于常规的喜欢
MPI_Comm_rank(MPI_Comm comm, int *rank);
Run Code Online (Sandbox Code Playgroud)
rust外部函数接口可以这样声明:
extern crate libc;
use libc::{c_int};
#[link(name = "mpi")]
extern {
fn MPI_Comm_rank(mpi_comm: c_int,
rank: *mut c_int);
}
Run Code Online (Sandbox Code Playgroud)
我这样调用绑定,这有效,但让我对语法感到困惑:
pub static MPI_COMM_WORLD : libc::c_int = 0x44000000;
fn main() {
let mut rank: c_int = 999999;
/* but why '&mut rank' and not simply '&rank' ? */
unsafe {MPI_Comm_rank(MPI_COMM_WORLD, &mut rank)}
}
Run Code Online (Sandbox Code Playgroud)
我最初尝试过
unsafe {MPI_Comm_rank(MPI_COMM_WORLD, &rank)}
Run Code Online (Sandbox Code Playgroud)
但这会产生编译错误:
mismatched types: expected `*mut i32` but found `&i32` (values differ in mutability)
Run Code Online (Sandbox Code Playgroud)
我宣称'等级'为mut,所以给出了什么?
你将两个截然不同的特征混为一谈.
let mut x;进行可变绑定x,允许您修改x绑定到的(x = 42)和非引用类型以修改其内容(x.y = 42).它不控制引用目标的可变性.
这与您正在处理的参考类型不同.
&mut T是一个可变参考,可以强制执行*mut T.
&T是一个不可变的引用可以被强制*const T.
由于您要调用的功能需要*mut T,您必须将其传递给a *mut T或a &mut T; *const T或&T不会这样做.
可以肯定,你只能拿一个可变引用可变数据,所以let x = 42; &mut x它需要不工作let mut x,而不是let x,但是这仍然是完全不同,是铁锈的有关规则的可变性的一部分.