3
假設我們有許多具有相同簽名的C函數,我們希望將它們註冊到Lua。例如,每個函數看起來像這樣的:在Lua中註冊相同簽名的C函數
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 foo(int n)
{
// do some work
}
我們可以與他們每個人的登記如何實現以下功能,避免重複的代碼。
void register(Lua_State *l, const char *name, void (*f)(int));
可能的話,可以使用預處理器宏(僅限編譯時)執行此操作。有沒有更優雅的方式?我更喜歡沒有任何外部綁定庫的解決方案。
你可能只是一個包裝函數,然後在每次註冊時在[upvalue](http://www.lua.org/pil/27.3.3.html)中存儲正確的函數指針。然後在函數中,只讀取upvalue並調用它。 – 2012-07-26 12:51:48