Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

D callbacks in C functions

Tags:

binding

lua

d

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_pushcfunction( 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.

like image 611
deft_code Avatar asked Jan 23 '23 09:01

deft_code


1 Answers

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.

like image 62
Bernard Avatar answered Jan 29 '23 21:01

Bernard