1

假设我正在与 C 交互。

这是接口的包装函数。

@property extern(C) void onEvent(void function(InterfaceStruct*, int, int, int) nothrow callback)
{
        interfaceSetCallback(handle, callback);
}

都好。

wrapper.onEvent = function void  (InterfaceStruct*, int x, int y, int z) nothrow
{
        if (x == 11) doSomething();
};

哦哦:

Error: function foo.bar.onEvent (void function(InterfaceStruct*, int, int, int) nothrow callback) is not callable using argument types (void function(InterfaceStruct* _param_0, int x, int y, int z) nothrow @nogc @safe)

因此,它希望我将函数文字设为 extern(C)。那么我该怎么做呢?我找不到任何办法这样做。

4

1 回答 1

3

您可以简单地使用 onEvent 分配整个函数定义,而不是提供整个函数定义

wrapper.onEvent = (a, x, y, z)
{
    if (x == 11) doSomething();
};

D 将自动为其分配正确的类型。

此外,您的代码实际上应该给您一个语法错误,因为 extern(C) 在将其用于函数指针定义时实际上是不允许的。

您也可以为函数指针类型定义一个别名并将赋值转换为它,如下所示:

alias EventCallback = extern(C) void function(InterfaceStruct*, int, int, int) nothrow;

@property extern(C) void onEvent(EventCallback callback)
{
        interfaceSetCallback(handle, callback);
}

// ...

wrapper.onEvent = cast(EventCallback) function void(InterfaceStruct*, int x, int y, int z) nothrow
{
        if (x == 11) doSomething();
};
于 2016-04-03T10:03:25.110 回答