在C函数中的回调函数

我正在编写 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); // 这肯定有效。
lua_pushcfunction(L, "dfunc", &dfunc); // 这可行吗?

如果我只能使用 cfunc,为什么?我在 C++ 中不需要做任何类似的操作。我只需将 C++ 函数的地址传递给 C,一切都能正常工作。

原文链接 https://stackoverflow.com/questions/2520220

点赞
CandyMi
CandyMi

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

C 和 D 中函数的调用约定是不同的,所以您必须告诉编译器使用 C 约定来调用函数,例如使用 extern (C)。我不知道为什么您在 C++ 中不必这样做。

有关与 C 进行接口交互的更多信息,请参见这里

值得注意的是,您可以使用 C 风格来声明函数参数。

2010-03-25 23:53:31
stackoverflow用户1343
stackoverflow用户1343

是的,您的 typedef 翻译是正确的。另一方面,您是否看过 htod 工具

2010-03-26 03:45:03