主要內容轉載自:子龍山人博客(強烈建議去子龍山人博客完全學習一遍)
部分內容查閱自:《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模塊》