gpt4 book ai didi

c - 在 Lua 中注册相同签名的 C 函数

转载 作者:行者123 更新时间:2023-12-02 02:13:32 26 4
gpt4 key购买 nike

假设我们有许多具有相同签名的 C 函数,我们想将它们注册到 Lua 中。例如,每个函数看起来像这样:

void foo(int n)
{
// do some work
}

我们可以通过以下方式注册它们中的每一个:

int wrap_foo(Lua_State *l)
{
int x = lua_tonumber(l, 1);
foo(x);
return 0;
}

lua_pushcfunction(l, wrap_foo);
lua_setglobal(l, "foo");

问题是:如何实现下面的功能,避免重复代码。

void register(Lua_State *l, const char *name, void (*f)(int));

可能,可以使用预处理器宏(仅编译时)来完成。有没有更优雅的方式?我更喜欢没有任何外部绑定(bind)库的解决方案。

最佳答案

你不能将它命名为 register,因为那是一个关键字,但如果我们称它为 register_wrapper,我们可以像这样实现 James McLaughlin 的建议:

// wrapper for a C function taking a single number argument
// the C function is bound to this wrapper as an upvalue
int wrapper(lua_State *L)
{
int x = lua_tonumber(L,1);
void (*wrapped)(int) = (void (*)(int)) lua_touserdata(L, lua_upvalueindex(1));
wrapped(x);
return 0;
}

// bind a C function to our wrapper function
void register_wrapper(lua_State* L, const char* name, void(*wrapped)(int))
{
lua_pushlightuserdata(L, wrapped);
lua_pushcclosure(L, wrapper, 1);
lua_setglobal(L, name);
}

int main()
{
lua_State *L = luaL_newstate();
register_wrapper(L, "foo", foo);
register_wrapper(L, "bar", bar);
...

关于c - 在 Lua 中注册相同签名的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11669611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com