2012-08-27 73 views
4

那麼不存在任何問題推C函數作爲函數成員或與lua_register(L,lua_func_name,c_func)寄存器C的功能LUA功能;推LUA函數從C API表構件

但如何告訴盧阿什麼,我想通過luaFoo()作爲回調函數參數有關從C「foober」? lua_pushcfunction - 推C函數,lua_pushstring推動只是一個普通的字符串,所以回調場成了字符串,而不是功能。

Lua代碼:

CALLBACKS = {}; 
FOO = 0; 

function luaFoo() 
FOO = FOO + 1; 
end; 

function addCallback(_name, _callback) 
CALLBACKS[_name] = _callback; 
end; 

function doCallback(_name) 
CALLBACKS[_name](); 
end; 

C代碼:

static int c_foo(lua_State* l) 
{ 
    printf("FOO\n"); 
    return 0; 
} 

/*load lua script*/; 
lua_State* l = /*get lua state*/; 
lua_getglobal(l, "addCallback"); 
lua_pushstring(l, "foober"); 
//What push for luaFoo() 
lua_pushcfunction(l, c_foo); 
lua_call(l, 2, 0); 

lua_getglobal(l, "doCallback"); 
lua_pushstring(l, "foober"); 
lua_call(l, 1, 0); 

Similiar - 如果我得到它已經與lua_register,如何將它們傳遞來自C.於是我們回調PARAM註冊的C函數註冊c_foo爲LUA功能,如何告訴我們想通過「c_foo」回調FUNC PARAM => c_foo存在。

回答

6

記住:

function luaFoo() 
    ... 
end 

等效於此,在Lua:

luaFoo = function() 
    ... 
end 

因此,你的問題最終歸結爲,「我已經在全局表中的值怎麼辦。我把它推到堆棧上?「這個值是一個函數的事實是無關; Lua中的函數值與整數值沒有什麼不同,它與字符串值沒有區別。很明顯,你可以做不同事情了,但是你只想各地複製它們。無論價值是什麼,這都是一樣的。

你要找的功能是lua_getglobal

至於你的第二個問題,你可以用兩種方法之一來完成。您可以從全局表中獲取您註冊的函數值,也可以使用lua_pushcfunction重新註冊。既然你沒有使用upvalues,重新註冊它並沒有任何缺點。

哦,還有一件事,代碼風格。在語句結束時,Lua不需要;。你可以做到這一點(以使C本地程序員感覺更舒適),但沒有必要。