在UNIX中,有个函数open,它被实现为接受可变个数参数,或2个,或3个 现在,假定如果需要用Rust实现这么一个函数接口给C语言用户,这样C语言用户根本无需在意这个接口是C实现的还是Rust实现的,请问,该如何做呢?
1
共 4 条评论, 1 页
在UNIX中,有个函数open,它被实现为接受可变个数参数,或2个,或3个 现在,假定如果需要用Rust实现这么一个函数接口给C语言用户,这样C语言用户根本无需在意这个接口是C实现的还是Rust实现的,请问,该如何做呢?
评论区
写评论谢谢回复。 我没有用这个va_list的crate,很新奇的是,我直接使用...,我通过gdb发现,在运行时这个占位被解释为一个VaList,然后,暴露给C语言的头文件的确可以跟printf那样变参了。不过,这个依赖于![feature(c_variadic)]这个feature, 编译器必须切换到nightly。
printf 这种是从第一个参数 fmt 里面根据 % 计算出来后续参数个数和类型,然后根据 x86/arm call convention 从栈里面读的。
open(2) 的 mode 也是类似,只有特定的 flags 才会根据 call convention 去读下一个 mode 参数。所以正常用 va_list 就行了,一样的。
这个固然是可以的,但是,还是没有像printf或者open那样明显,这是vprintf之类的用法,调用起来没有...方便
https://crates.io/crates/va_list