3

假设我们有许多相同签名的 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));

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

4

1 回答 1

2

你不能命名它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);
    ...
于 2012-07-26T18:50:41.577 回答