Как я могу передать литерал функции 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();
};