柚子快報(bào)邀請(qǐng)碼778899分享:開發(fā)語言 lua調(diào)用C++函數(shù)
柚子快報(bào)邀請(qǐng)碼778899分享:開發(fā)語言 lua調(diào)用C++函數(shù)
第一步搭建lua的環(huán)境.
win10 lua環(huán)境搭建-CSDN博客
我使用的環(huán)境是win10+vs2015+lua54
先來個(gè)最簡(jiǎn)單的lua調(diào)用C++函數(shù),
無參數(shù)無返回值的
第一步:定義C++函數(shù).
int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數(shù),返回1表示有一個(gè)返回參數(shù)
{
std::cout << "int CTest" << std::endl;
return 0;
}
這個(gè)函數(shù),除了函數(shù)名可以自己定義其他的都要按這個(gè)來定義.
返回值是固定的int類型,返回0表示沒有返回參數(shù),返回1表示有一個(gè)返回參數(shù).
第二步:注冊(cè)函數(shù).
lua_register(lua,"CTest",CTest);?
第一個(gè)參數(shù)是lua的lua_State的指針,第二個(gè)是lua的注冊(cè)函數(shù)名字,這個(gè)名字是在lua代碼里使用的,第三個(gè)參數(shù)是函數(shù)指針就是剛才定義的C++函數(shù).
#include
extern "C"
{
#include
#include
#include
}
int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數(shù),返回1表示有一個(gè)返回參數(shù)
{
std::cout << "int CTest" << std::endl;
return 0;
}
int main()
{
lua_State *lua = luaL_newstate();
luaopen_base(lua);
luaopen_string(lua);
lua_register(lua,"CTest",CTest); //第一個(gè)參數(shù)是lua狀態(tài)指針,第二個(gè)參數(shù)是函數(shù)名稱,第三個(gè)參數(shù)是lua函數(shù)指針,第二個(gè)參數(shù)和第三個(gè)參數(shù)可以用不同的名字,但第三個(gè)必須使用正確的函數(shù)指針
luaL_loadfile(lua, "D:\\code\\MyCode\\C++\\Lua\\CPPAddLua\\testLua\\x64\\Debug\\main.lua");
lua_pcall(lua, 0,0,0);
getchar();
return 0;
}
直接運(yùn)行
這樣就是lua調(diào)用到了C++函數(shù).當(dāng)然這里lua調(diào)用C++ 函數(shù)是指在C++代碼中的調(diào)用.
lua傳遞參數(shù),沒有返回值
只需要從lua的堆棧拿出一個(gè)參數(shù)即可.在此之前還需要再注冊(cè)一下.
lua_register(lua, "CTestToString", CTestToString);
const char* luaStr = lua_tostring(L,1);
?這樣得到的就是lua傳遞的參數(shù).
int CTestToString(lua_State* L)
{
const char* luaStr = lua_tostring(L,1);
std::cout << luaStr << std::endl;
return 0;
}
?
?傳第二個(gè)參數(shù)就再獲取一下第二個(gè)參數(shù).
?
int num = lua_tointeger(L,2);
int CTestToString(lua_State* L)
{
const char* luaStr = lua_tostring(L,1);
std::cout << luaStr << std::endl;
int num = lua_tointeger(L,2);
std::cout << num << std::endl;
return 0;
}
?
傳遞普通參數(shù)就這樣傳遞.
lua傳遞數(shù)組給C++函數(shù)
第一步注冊(cè)函數(shù):
lua_register(lua, "CTestArr", CTestArr);
第二步:編寫接收函數(shù)
int CTestArr(lua_State* L)
{
std::vector
std::cout << "int CTestArr" << std::endl;
int arraySize = luaL_len(L, 1); //獲取表的大小
for (int i = 1; i <= arraySize; ++i)
{
lua_pushnumber(L,i); //往棧中壓入一個(gè)數(shù)字,表示從數(shù)組中取那個(gè)下標(biāo)的值,lua都是從1開始的所以i從1開始
lua_gettable(L, 1); //把上一行索引的位置出棧,再把i壓入 棧
vStr.push_back(lua_tostring(L,-1));
lua_pop(L,1);
}
for (auto& value : vStr)
{
std::cout << value << std::endl;
}
return 0;
}
第三步:lua調(diào)用
.
lua傳遞表給C++函數(shù)
lua_next3(L,3)
先從棧頂彈出一個(gè)key從棧指定位置的table里取下一對(duì)key-value,先將key入棧再將value入棧如果第2步成功則返回非0值,否則返回0,并且不向棧中壓入任何值.
第一步注冊(cè)函數(shù):
lua_register(lua, "CTestTable", CTestTable);
第二步:
int CTestTable(lua_State* L)
{
std::cout << "int CTestTable" << std::endl;
std::map
lua_pushnil(L);
while (lua_next(L, 1) != 0)
{
mStr[lua_tostring(L, -2)] = lua_tostring(L,-1);
lua_pop(L,1);
}
for (auto& value : mStr)
{
std::cout << value.first << " = " << value.second << std::endl;
}
return 0;
}
第三步lua調(diào)用:
?結(jié)果:
lua調(diào)用C++ 獲取表中的內(nèi)容
lua_getfield(L,1,"name");
std::cout << lua_tostring(L,-1) << std::endl;
Lua調(diào)用C++參數(shù)類型檢查
luaL_checktype(L,1,LUA_TBOOLEAN);
if (lua_type(L, 1) != LUA_TBOOLEAN)
{
luaL_argerror(L,1,"bad argument");
}
第一行,一旦不匹配代碼就不會(huì)往下執(zhí)行,
第二行的不匹配還會(huì)往下執(zhí)行.
Lua調(diào)用C++ 返回值普通類型
第一步:注冊(cè)函數(shù):
lua_register(lua, "TestRe", TestRe);
第二步寫函數(shù):
int TestRe(lua_State* L)
{
lua_pushstring(L,"return value");
return 1;
}
一個(gè)返回參數(shù)就返回1,兩個(gè)就返回2
第三步lua代碼
結(jié)果:
lua返回表
第一步注冊(cè)函數(shù):
lua_register(lua, "TestReTable", TestReTable);
第二步寫注冊(cè)函數(shù)
int TestReTable(lua_State* L)
{
lua_newtable(L); // 創(chuàng)建一個(gè)表格,放在棧頂
lua_pushstring(L,"name"); // 壓入key
lua_pushstring(L,"ccname");//壓入value
lua_settable(L,-3); //彈出key value,并設(shè)置到表,表在棧頂了作為返回值
lua_pushstring(L, "age"); // 壓入key
lua_pushinteger(L, 21);//壓入value
lua_settable(L, -3); //彈出key value,并設(shè)置到表,表在棧頂了作為返回值
return 1;
}
第三步:lua
結(jié)果:
C++全部代碼:
#include
extern "C"
{
#include
#include
#include
}
#include
#include
#include
int CTest(lua_State* L) // 返回值是固定的int類型,返回0表示沒有返回參數(shù),返回1表示有一個(gè)返回參數(shù)
{
std::cout << "int CTest" << std::endl;
return 0;
}
int CTestToString(lua_State* L)
{
const char* luaStr = lua_tostring(L,1);
std::cout << luaStr << std::endl;
int num = lua_tointeger(L,2);
std::cout << num << std::endl;
bool is = lua_toboolean(L, 3);
std::cout << is << std::endl;
return 0;
}
int CTestArr(lua_State* L)
{
std::vector
std::cout << "int CTestArr" << std::endl;
int arraySize = luaL_len(L, 1); //獲取表的大小
for (int i = 1; i <= arraySize; ++i)
{
lua_pushnumber(L,i); //往棧中壓入一個(gè)數(shù)字,表示從數(shù)組中取那個(gè)下標(biāo)的值,lua都是從1開始的所以i從1開始
lua_gettable(L, 1); //把上一行索引的位置出棧,再把i壓入 棧
vStr.push_back(lua_tostring(L,-1));
lua_pop(L,1);
}
for (auto& value : vStr)
{
std::cout << value << std::endl;
}
return 0;
}
int CTestTable(lua_State* L)
{
std::cout << "int CTestTable" << std::endl;
/* 讀取全部的表的內(nèi)容 */
std::map
lua_pushnil(L);
while (lua_next(L, 1) != 0)
{
mStr[lua_tostring(L, -2)] = lua_tostring(L,-1);
lua_pop(L,1);
}
for (auto& value : mStr)
{
std::cout << value.first << " = " << value.second << std::endl;
}
/* 只取一個(gè)
lua_getfield(L,1,"name");
std::cout << lua_tostring(L,-1) << std::endl;
*/
return 0;
}
int TestRe(lua_State* L)
{
lua_pushstring(L,"return value");
return 1;
}
int TestReTable(lua_State* L)
{
lua_newtable(L); // 創(chuàng)建一個(gè)表格,放在棧頂
lua_pushstring(L,"name"); // 壓入key
lua_pushstring(L,"ccname");//壓入value
lua_settable(L,-3); //彈出key value,并設(shè)置到表,表在棧頂了作為返回值
lua_pushstring(L, "age"); // 壓入key
lua_pushinteger(L, 21);//壓入value
lua_settable(L, -3); //彈出key value,并設(shè)置到表,表在棧頂了作為返回值
return 1;
}
int main()
{
lua_State *lua = luaL_newstate();
luaopen_base(lua);
luaopen_string(lua);
lua_register(lua,"CTest",CTest); //第一個(gè)參數(shù)是lua狀態(tài)指針,第二個(gè)參數(shù)是函數(shù)名稱,第三個(gè)參數(shù)是lua函數(shù)指針,第二個(gè)參數(shù)和第三個(gè)參數(shù)可以用不同的名字,但第三個(gè)必須使用正確的函數(shù)指針
lua_register(lua, "CTestToString", CTestToString);
lua_register(lua, "CTestArr", CTestArr);
lua_register(lua, "CTestTable", CTestTable);
lua_register(lua, "TestRe", TestRe);
lua_register(lua, "TestReTable", TestReTable);
luaL_loadfile(lua, "D:\\code\\MyCode\\C++\\Lua\\CPPAddLua\\testLua\\x64\\Debug\\main.lua");
lua_pcall(lua, 0,0,0);
getchar();
return 0;
}
lua全部代碼:
CTest()
CTestToString("lua string",123456,true)
local arr = {"A001","A002","A003"};
CTestArr(arr)
local tab = {name="xiaoming",age="22",id="007"};
CTestTable(tab)
local re = TestRe()
print("re = " .. re)
local retab = TestReTable()
print("name = " .. retab["name"])
print("name = " .. retab["age"])
柚子快報(bào)邀請(qǐng)碼778899分享:開發(fā)語言 lua調(diào)用C++函數(shù)
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。