C 我该如何解决这个问题;在外部模块中找到Rust元组类型;考虑使用结构代替“警告
上面的代码可以工作,但我得到了以下警告:C 我该如何解决这个问题;在外部模块中找到Rust元组类型;考虑使用结构代替“警告,c,rust,C,Rust,上面的代码可以工作,但我得到了以下警告: use std::ptr; #[repr(C)] struct timeval { tv_sec: i64, tv_usec: i64 } extern { fn gettimeofday(tv: &mut timeval, tzp: *const ()) -> i32; } fn time1000() -> i64 { let mut tv = timeval { tv_sec: 0, tv_u
use std::ptr;
#[repr(C)]
struct timeval {
tv_sec: i64,
tv_usec: i64
}
extern {
fn gettimeofday(tv: &mut timeval, tzp: *const ()) -> i32;
}
fn time1000() -> i64 {
let mut tv = timeval { tv_sec: 0, tv_usec: 0 };
unsafe {
gettimeofday(&mut tv, ptr::null());
}
tv.tv_sec * 1000 + tv.tv_usec / 1000
}
消息很详细,但我无法理解这个*const()
东西有什么问题,以及如何满足这里的编译器。()
是一个元组(空元组)。元组的内存布局不能保证与C兼容,因此元组不应在外部函数接口中使用。因此发出警告
您应该使用结构,而不是元组
因此,为了消除警告,您可以定义一些伪结构,并将其用作tzp空指针的类型。()
是一个元组(空元组)。元组的内存布局不能保证与C兼容,因此元组不应在外部函数接口中使用。因此发出警告
您应该使用结构,而不是元组
因此,为了消除警告,您可以定义一些伪结构,并将其用作tzp空指针的类型。一个快速而肮脏的解决方案是定义一个空的
tz
枚举并声明tzp:.const tz
。当您将ptr::null()
用于tzp
时,这很好
test.rs:10:44: 10:53 warning: found Rust tuple type
in foreign module; consider using a struct instead`, #
[warn(improper_ctypes)] on by default
test.rs:10 fn gettimeofday(tv: &mut timeval, tzp: *const ()) -> i32;
^~~~~~~~~
但是您应该使用libc
cratet,而不是创建自己的绑定。libc
板条箱可以在许多平台上工作,而您的绑定不能。例如,您假设time\t
(tv\u sec
的类型)是i64
,但在某些平台中是i32
enum tz {}
extern "C" {
fn gettimeofday(tv: &mut timeval, tzp: *const tz) -> i32;
}
一个快速而肮脏的解决方案是定义一个空的
tz
enum并声明tzp:*const tz
。当您将ptr::null()
用于tzp
时,这很好
test.rs:10:44: 10:53 warning: found Rust tuple type
in foreign module; consider using a struct instead`, #
[warn(improper_ctypes)] on by default
test.rs:10 fn gettimeofday(tv: &mut timeval, tzp: *const ()) -> i32;
^~~~~~~~~
但是您应该使用libc
cratet,而不是创建自己的绑定。libc
板条箱可以在许多平台上工作,而您的绑定不能。例如,您假设time\t
(tv\u sec
的类型)是i64
,但在某些平台中是i32
enum tz {}
extern "C" {
fn gettimeofday(tv: &mut timeval, tzp: *const tz) -> i32;
}
我认为它是在说()不是C类型,所以将指向C的指针传递给C是没有意义的。您也应该声明struct tz
。另外,我不确定传递引用而不是原始指针是否正确。我认为它的意思是()不是C类型,因此将指针传递给C是没有意义的。您也应该声明struct tz
。此外,我不确定传递引用而不是原始指针是否正确。