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
。此外,我不确定传递引用而不是原始指针是否正确。