< 返回版块

kipade 发表于 2025-05-26 16:23

Tags:可变参数;FFI

在UNIX中,有个函数open,它被实现为接受可变个数参数,或2个,或3个 现在,假定如果需要用Rust实现这么一个函数接口给C语言用户,这样C语言用户根本无需在意这个接口是C实现的还是Rust实现的,请问,该如何做呢?

评论区

写评论
作者 kipade 2025-05-28 09:56

谢谢回复。 我没有用这个va_list的crate,很新奇的是,我直接使用...,我通过gdb发现,在运行时这个占位被解释为一个VaList,然后,暴露给C语言的头文件的确可以跟printf那样变参了。不过,这个依赖于![feature(c_variadic)]这个feature, 编译器必须切换到nightly。

gwy15 2025-05-27 18:52

printf 这种是从第一个参数 fmt 里面根据 % 计算出来后续参数个数和类型,然后根据 x86/arm call convention 从栈里面读的。

open(2) 的 mode 也是类似,只有特定的 flags 才会根据 call convention 去读下一个 mode 参数。所以正常用 va_list 就行了,一样的。

作者 kipade 2025-05-26 20:11

这个固然是可以的,但是,还是没有像printf或者open那样明显,这是vprintf之类的用法,调用起来没有...方便

gwy15 2025-05-26 16:56

https://crates.io/crates/va_list

1 共 4 条评论, 1 页