Lua和C++交互 學習記錄之七:C++全局函數注冊為Lua模塊


主要內容轉載自:子龍山人博客(強烈建議去子龍山人博客完全學習一遍)

部分內容查閱自:《Lua 5.3  參考手冊》中文版 譯者 雲風 制作 Kavcc

 

vs2013+lua-5.3.3

 

1.將C++封裝為模塊

①在Lua中調用的函數(和上一節的函數一樣)

 1 int average(lua_State* L){  2 
 3     //stack_dump(L);  4 
 5 
 6     //lua->stack,得到Lua調用函數輸入的個數
 7     int lua_args_count = lua_gettop(L);  8 
 9     //lua->c,得到所有Lua中輸入參數的值
10     lua_Number sum = 0; 11     for (int i = 1; i <= lua_args_count; ++i){ 12         sum += lua_tonumber(L, i); 13  } 14 
15     //c->stack,將平均值和總值返回到Lua中的返回值
16     lua_pushnumber(L, sum / lua_args_count); 17  lua_pushnumber(L, sum); 18 
19     //stack_dump(L); 20 
21     //返回個數給Lua
22     return 2; 23 }

②列出需要封裝的全局函數

1 static const luaL_Reg mylibs_funcs[] = { 2     { "average", average }, 3  { NULL, NULL } 4 };

③定義一個注冊模塊函數,這個函數必須符合如下函數簽名:

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

在該函數里將上面數組列出的函數壓到棧里

1 int lua_openmylib(lua_State* L){ 2     luaL_newlib(L, mylibs_funcs); //將所有函數放到一個table中
3     return 1; //將這個table壓到stack里
4 }

④將自定義模塊加到注冊列表里(請參考《Lua和C++交互 學習記錄之一:C++嵌入腳本》

1 static const luaL_Reg lua_reg_libs[] = { 2     { "base", luaopen_base }, 3     { "mylib", lua_openmylib }, //這里為自定義的模塊名字mylib
4  { NULL, NULL } 5 };

⑤注冊該模塊(請參考《Lua和C++交互 學習記錄之一:C++嵌入腳本》

1 //注冊讓lua使用的庫
2 const luaL_Reg* lua_reg = lua_reg_libs; 3 for (; lua_reg->func; ++lua_reg){ 4     luaL_requiref(L, lua_reg->name, lua_reg->func, 1); 5     lua_pop(L, 1); 6 }

 

 

2.Lua中進行調用

1 local ave,sum = mylib.average(10,20,30) 2 print("ave : ",ave," sum : ",sum)

 

Lua和C++交互系列:

Lua和C++交互 學習記錄之一:C++嵌入腳本

Lua和C++交互 學習記錄之二:棧操作

Lua和C++交互 學習記錄之三:全局值交互

Lua和C++交互 學習記錄之四:全局table交互

Lua和C++交互 學習記錄之五:全局數組交互

Lua和C++交互 學習記錄之六:全局函數交互

Lua和C++交互 學習記錄之七:C++全局函數注冊為Lua模塊

Lua和C++交互 學習記錄之八:C++類注冊為Lua模塊

Lua和C++交互 學習記錄之九:在Lua中以面向對象的方式使用C++注冊的類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM