2010-08-05 41 views
0

我有一個函數,它使用C中的可變數量參數來傳遞給另一個lua函數。在純Lua我可以做這樣的事情如何在C語言中使用lua中的...操作符

function foo(...) 
    print(...) 
end 

如果我要在C中實現函數,我該怎麼做同樣的事情?

編輯:我可能措辭不好。我想要做的就是使用Lua API在C語言中編寫函數foo,但我不知道如何將我從Lua棧中獲得的參數傳遞給print,因爲我不知道有多少,我找不到任何方法來檢查。

回答

2

檢查堆棧中參數個數的方法是使用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"); 
} 
2

所有LUA可調用的C函數必須是lua_CFunction類型:

typedef int (*lua_CFunction) (lua_State *L); 

lua_State可以包含可變數量的參數,如圖中的Lua 5.1參考手冊的§3.7。您不能使用'正常'C可變參數函數。

1

在閱讀了schot的鏈接後,我想我已經回答了我自己的問題。 lua_gettop會告訴我傳入的參數的數量,所以我知道需要將什麼內容推送到棧中。

我只是沒有想到的功能來檢查堆棧大小被稱爲「gettop」。我會期待「checkstack」或其他東西,但是這完全是另一回事。

+0

'lua_gettop()'告訴你堆棧頂部的堆棧索引。在C函數的入口處,恰好對應於傳遞的參數數量。 – RBerteig 2010-08-05 21:34:39