我有一個函數,它使用C中的可變數量參數來傳遞給另一個lua函數。在純Lua我可以做這樣的事情如何在C語言中使用lua中的...操作符
function foo(...)
print(...)
end
如果我要在C中實現函數,我該怎麼做同樣的事情?
編輯:我可能措辭不好。我想要做的就是使用Lua API在C語言中編寫函數foo,但我不知道如何將我從Lua棧中獲得的參數傳遞給print,因爲我不知道有多少,我找不到任何方法來檢查。
我有一個函數,它使用C中的可變數量參數來傳遞給另一個lua函數。在純Lua我可以做這樣的事情如何在C語言中使用lua中的...操作符
function foo(...)
print(...)
end
如果我要在C中實現函數,我該怎麼做同樣的事情?
編輯:我可能措辭不好。我想要做的就是使用Lua API在C語言中編寫函數foo,但我不知道如何將我從Lua棧中獲得的參數傳遞給print,因爲我不知道有多少,我找不到任何方法來檢查。
檢查堆棧中參數個數的方法是使用lua_gettop()
函數。
嘗試從C函數如下:
lua_getfield(L, LUA_GLOBALSINDEX, "print");
lua_insert(L, 1);
lua_call(L, lua_gettop(L)-1, 0);
的lua_call()
會彈出所有參數從棧,所以如果你想保留它們,你將需要略微調整,以使副本所有參數。
int args=lua_gettop(L);
if(lua_checkstack(L, args+1))
{
int i;
lua_getfield(L, LUA_GLOBALSINDEX, "print");
for(i=1;i<=args;i++)
lua_pushvalue(L, i);
lua_call(L, args, 0);
}
else
{
return luaL_error(L, "cannot grow stack");
}
所有LUA可調用的C函數必須是lua_CFunction
類型:
typedef int (*lua_CFunction) (lua_State *L);
的lua_State
可以包含可變數量的參數,如圖中的Lua 5.1參考手冊的§3.7。您不能使用'正常'C可變參數函數。
在閱讀了schot的鏈接後,我想我已經回答了我自己的問題。 lua_gettop會告訴我傳入的參數的數量,所以我知道需要將什麼內容推送到棧中。
我只是沒有想到的功能來檢查堆棧大小被稱爲「gettop」。我會期待「checkstack」或其他東西,但是這完全是另一回事。
'lua_gettop()'告訴你堆棧頂部的堆棧索引。在C函數的入口處,恰好對應於傳遞的參數數量。 – RBerteig 2010-08-05 21:34:39