2016-08-17 83 views
3

我有这样的代码:Rust如何在args结尾处理带“...”的函数?

pub type f_t = 
    ::std::option::Option<extern "C" fn(a: ::std::os::raw::c_int, ...)>; 

#[repr(C)] 
#[derive(Copy, Clone)] 
#[derive(Debug)] 
pub struct Foo { 
    pub f: f_t, 
} 

fn main() { 
} 

它不会编译,因为没有默认Clone实施功能用“......”在args来结束。

  1. Rust如何在行尾处理这个“...”,它是否与C中的“...”做同样的事情?

  2. Rust无法编译此代码,但如果我评论, ...,它编译得很好。有什么区别,为什么一类函数指针实现Clone而另一类不是?

  3. 我该如何实现Clone这样的功能?

+0

这些被称为[* variadic functions *](https://en.wikipedia.org/wiki/Variadic_function)。 – Shepmaster

回答

5
  1. 这意味着大约因为它在C.锈没有本地参数可变功能(也可以不执行一个鲁斯特本身)相同,但它支持语法作为一个特殊的情况下绑定到C功能。
  2. Rust并不知道C函数的真实签名是什么。所以你可以将它声明为任何你想要的,但是如果你弄错了,那么调用该函数可能会在运行时崩溃。
  3. 这是一个无意的遗漏,这些函数指针应该是神奇的Clone。在夜间和测试版中,这已经修复。