經過前面4篇文章的介紹,我們對lua的堆棧已經比較熟悉了。下面我們來看看C++是怎麼調用lua的函數。
首先,我們來看看lua文件是什麼樣的:
-- helloLua.lua 文件
myName="beautiful girl"
helloTable={name="cfy",age=23}
function helloAdd(num1,num2)
retrun(num1,num2)
end
我們觀察到多了一個helloAdd函數,現在我們就用C++來調用這個函數。
創建一個項目,名爲“CppCallLua”,依舊創建一個HelloLua類,主要代碼如下:
bool HelloLua::init()
{
/* 初始化 */
lua_State* pL=lua_open();
luaopen_base(pL);
/* 執行腳本 */
luaL_dofile(pL,"helloLua.lua");
/* 重置棧頂元素 */
lua_settop(pL,0)
/* 把helloAdd函數對象放到棧中 */
lua_getglobal(pL,"helloAdd");
/* 把函數所需要的參數入棧 */
lua_pushnumber(pL,3);
lua_pushnumber(pL,4);
/* 執行函數,第二個參數表示函數的參數個數,第三個參數表示函數返回值個數
lua會先去堆棧去出參數,然後再取出函數對象,開始執行函數 */
lua_call(pL,2,1);
int iResult=lua_tonumber(pL,-1);
CCLOG("iResult=%d",iResult);
return true;
}
總結一下:
(1)執行腳本
(2)將helloAdd函數放到棧中:lua_getglobal(pL,"helloAdd")
(3)helloAdd有2個參數,我們要把參數傳遞給lua,所以2個參數都要放到棧裏
(4)第二和第三步已經把函數所需要的數據都放到棧裏了,接下來只要告訴lua去棧裏取數據,然後執行函數,調用lua_call就可以了。
用調試模式運行項目,將看到如下日誌輸出:
iResult=7