C++呼叫lua,lua呼叫C++
//cpp檔案
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>
#include <lua5.1/lualib.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
//供lua呼叫的C函式
static int ComWrite(lua_State* L)
{
//lua取引數的順序是從右到左
int interval = luaL_checklong(L, -2);//棧頂第二個元素
int waitingTime = luaL_checklong(L, -1);//棧頂第一個元素
printf("interval = %d\twaitingTime = %d\n", interval, waitingTime);
return 1;
}
unsigned char buf[] = {"hello world"};
int main()
{
const char *peizhi = "test.lua";
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_pushcfunction(L, (lua_CFunction)&ComWrite); //註冊在lua中使用的c函式
lua_setglobal(L, "ComWrite"); //繫結到lua中的名字ComWrite
//載入lua檔案並執行lua檔案
if (luaL_loadfile(L, peizhi) || lua_pcall(L, 0, 0, 0))
{
printf("error..........\n");
exit(0);
}
//將protocol這個變數放在棧頂,對應lua檔案中的protocol這個table
lua_getglobal(L, "Protocol");
//如果protocol不是一個table,返回錯誤
if (!lua_istable(L, -1))
{
printf("Protocol is not table\n");
exit(0);
}
//往棧中壓入func,現在func欄位在棧頂
lua_pushstring(L, "func");
//把protocol這張表中func對應於的值(f,這是個函式)放在棧頂,彈出func欄位
lua_gettable(L, -2);
assert(lua_isfunction(L, -1));
//壓入f函式的1個行參,
lua_pushlstring(L, (const char*)buf, sizeof(buf) / sizeof(buf[0]));
//lua_pcall(L, 2, 1, 0)中的2代表2個形參,1代表1個返回值,如果函式執行正確返回值為0,並且f和形參從棧頂彈出,返回值放在棧頂
if (lua_pcall(L, 1, 2, 0) != 0)
{
printf("error running function func:%s\n", lua_tostring(L, -1));
}
lua_pop(L, 1);
return 0;
}
--lua檔案,名為test.lua
function ParseData(szStr)
print("szStr = " .. szStr)
local interval = 1
local waitingTime = 2
ComWrite(interval, waitingTime)
end
Protocol =
{
func = ParseData,
}
return Protocol;