开发者

D callbacks in C functions

I am writing D2 bindings for Lua. This is in one of the Lua header files.

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

I assume the equivalent D2 statement would be:

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

Lua also provides an api function:

void lua_pushcfu开发者_StackOverflow中文版nction( lua_State* L, string name, lua_CFunction func );

If I want to push a D2 function does it have to be extern(C) or can I just use the function?

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?

If I can only use cfunc, why? I don't need to do anything like that in C++. I can just pass the address of a C++ function to C and everything just works.


Yes, the function must be declared as extern (C).

The calling convention of functions in C and D are different, so you must tell the compiler to use the C convention with extern (C). I don't know why you don't have to do this in C++.

See here for more information on interfacing with C.

It's also worth noting that you can use the C style for declaring function arguments.


Yes, your typedef translation is correct. OTOH have you looked at the htod tool?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜