D обратные вызовы в функциях C - PullRequest
4 голосов
/ 26 марта 2010

Я пишу D2 привязки для Луа. Это в одном из заголовочных файлов Lua.

typedef int (*lua_CFunction) (lua_State *L);

Я предполагаю, что эквивалентный оператор D2 будет:

extern(C) alias int function( lua_State* L ) lua_CFunction;

Lua также предоставляет функцию API:

void lua_pushcfunction( lua_State* L, string name, lua_CFunction func );

Если я хочу нажать на D2 функцию, она должна быть внешней (C) или я могу просто использовать функцию?

int dfunc( lua_State* L )
{
   std.stdio.writeln("dfunc");
}

extern(C) int cfunc( lua_State* L )
{
   std.stdio.writeln("cfunc");
}

lua_State* L = lua_newstate();
lua_pushcfunction(L, "cfunc", &cfunc); //This will definitely work.
lua_pushcfunction(L, "dfunc", &dfunc); //Will this work?

Если я могу использовать только cfunc, почему? Мне не нужно ничего делать в C++. Я могу просто передать адрес функции C++ на C и все просто работает.

Ответы [ 2 ]

8 голосов
/ 26 марта 2010

Да, функция должна быть объявлена ​​как extern (C).

Соглашение о вызове функций в C и D отличается, поэтому вы должны указать компилятору использовать соглашение C с extern (C). Я не знаю, почему вы не должны делать это в C ++.

См. здесь для получения дополнительной информации о взаимодействии с C.

Стоит также отметить, что вы можете использовать стиль C для объявления аргументов функции.

1 голос
/ 26 марта 2010

Да, ваш перевод typedef правильный. ОТОХ вы смотрели на htod инструмент ?

...