C函数中的D回调

时间:2010-03-25 23:37:14

标签: binding lua d

我正在为Lua编写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函数,它必须是extern(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 个答案:

答案 0 :(得分:8)

是的,该函数必须声明为extern (C)

C和D中函数的调用约定是不同的,因此您必须告诉编译器将C约定与extern (C)一起使用。我不知道为什么你不必在C ++中这样做。

有关与C接口的详细信息,请参阅here

值得注意的是,您可以使用C样式声明函数参数。

答案 1 :(得分:1)

是的,你的typedef翻译是正确的。 OTOH你看过the htod tool吗?