C中传递的可变参数的类型。
在NativeFunction 中的签名需要指定 FFI 调用中使用的每个实际参数的确切类型。
例如,考虑 C 中的 printf
调用。
int printf(const char *format, ...);
void call_printf() {
int a = 4;
double b = 5.5;
const char* format = "...";
printf(format, a, b);
}
要直接从 Dart 使用这两种参数类型调用 printf
,定义如下原生类型
/// `int printf(const char *format, ...)` with `int` and `double` as
/// varargs.
typedef NativePrintfIntDouble =
Int Function(Pointer<Char>, VarArgs<(Int, Double)>);
注意 VarArgs
类型参数中的记录类型。
如果只传递单个可变参数,记录类型必须包含一个尾随逗号
/// `int printf(const char *format, ...)` with only `int` as varargs.
typedef NativePrintfInt = Int Function(Pointer<Char>, VarArgs<(Int,)>);
当使用不同的可变参数类型调用可变函数时,需要创建多个绑定。为了避免为相同的符号进行多次 DynamicLibrary.lookup,可以转换符号的指针
final dylib = DynamicLibrary.executable();
final printfPointer = dylib.lookup('printf');
final void Function(Pointer<Char>, int, double) printfIntDouble =
printfPointer.cast<NativeFunction<NativePrintfIntDouble>>().asFunction();
final void Function(Pointer<Char>, int) printfInt =
printfPointer.cast<NativeFunction<NativePrintfInt>>().asFunction();
如果没有传递可变参数,必须使用空记录类型传递 VarArgs
/// `int printf(const char *format, ...)` with no varargs.
typedef NativePrintfNoVarArgs = Int Function(Pointer<Char>, VarArgs<()>);
VarArgs 必须是最后一个参数。
VarArgs 在 Dart 代码中不可构造,仅作为类型签名中的标记。
- 实现类型
- 注解
-
- @Since('3.0')
属性
- hashCode → int
- 该对象的哈希码。无设置器继承
- runtimeType → Type
- 该对象运行时类型的表示。无设置器继承
方法
-
noSuchMethod(
Invocation invocation) → dynamic - 当访问不存在的方法或属性时调用。继承
-
toString(
) → String - 该对象的字符串表示。继承
运算符
-
operator ==(
Object other) → bool - 等于运算符。继承