Как я могу передать литерал функции extern(C)?

Скажи, что я взаимодействую с 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). Так как я могу это сделать? Я не могу найти способ сделать это.

1 ответ

Решение

Вместо предоставления полного определения функции вы можете просто назначить 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();
};
Другие вопросы по тегам