C语言中传递的可变参数类型。
在NativeFunction中的签名需要指定在FFF调用中使用到的每个实际参数的确切类型。
例如,在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')
构造函数
- VarArgs()
属性
- hashCode → int
- 该对象的哈希码。no setterinherited
- runtimeType → Type
- 表示对象运行时类型的表示。no setterinherited
方法
-
noSuchMethod(
Invocation invocation) → dynamic - 当访问不存在的方法或属性时调用。inherited
-
toString(
) → String - 该对象的一个字符串表示。inherited
运算符
-
operator ==(
Object other) → bool - 等于操作符。inherited