本篇文章为之后的xlua打铺垫
环境配置
没绷住,鼓捣了半天才弄好
主要配置方法见下链接
按照上面的还不够,跑的时候还是报错了
进行下面修改后跑通了
[2]
#include时要加上extern "C",告知编译器链接时不要按C++方法查找符号,这一步很重要。
extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" }
Lua和c交互的原理---虚拟栈
栈
Lua 和 C之间通信的主要组件是无处不在的虚拟栈(stack), 几乎所有的API调用都是 在操作这个栈中的值, Lua与C之间所有的数据交换都是通过这个栈完成的。 此外,还可以 利用栈保存中间结果。
栈中的每个元素都能保存Lua中任意类型的值。 当我们想要从Lua中获取一个值 (例如一个全局变量的值)时,只需调用Lua, Lua就会将指定的值压入栈中。 当想要将一个 值传给Lua时, 首先要将这个值压入栈,然后调用Lua将其从栈中弹出即可
如图栈顶索引为-1,栈底索引为1
压入元素C API
获取元素C API
检查类型
小实验
void stackTest()
{
lua_State* L = luaL_newstate();
lua_pushstring(L, "testForCCallLua");
lua_pushnumber(L, 123);
//读栈取值
if (lua_isstring(L, -2))//或if(lua_isstring(L,1))
{
std::cout << lua_tostring(L, -2) << std::endl;
}
if (lua_isnumber(L, -1))
{
std::cout << lua_tonumber(L, -1) << std::endl;
}
//关闭state
lua_close(L);
}
int main()
{
stackTest();
system("pause");
return 0;
}
c调用Lua
Lua代码
-- test.lua
name = "ccc"
id = 33
user = { uid = 33, uname = "forward256&#