我正在为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
,一切正常。
答案 0 :(得分:8)
是的,该函数必须声明为extern (C)
。
C和D中函数的调用约定是不同的,因此您必须告诉编译器将C约定与extern (C)
一起使用。我不知道为什么你不必在C ++中这样做。
有关与C接口的详细信息,请参阅here。
值得注意的是,您可以使用C样式声明函数参数。
答案 1 :(得分:1)
是的,你的typedef翻译是正确的。 OTOH你看过the htod
tool吗?