阅读本篇文章之前,请先阅读 lua入门级这篇文章,了解C++与lua之间是通过栈来交换数据的;
下面介绍几个后面会用到的函数:
C语言向栈写入或读取函数:
lua_push**(L,value); //**表示数据类型 一般为nil number string ……
lua_to**(L,index) //index 位置索引
C中执行lua函数的相关函数:
lua_getglobal(L,"var")会执行两步操作:
1.将var放入栈中
2.由Lua去寻找变量var的值,并将变量var的值返回栈顶(替换var)。
lua_pcall(L,2,1,0); 这句话是执行lua中的函数 的函数,
L:当前环境;2:函数中参数的个数;1:函数的返回值的个数;0:一般这个参数都是0,这样如果lua函数执行遇见问题时,错误信息将被压入栈中;
函数的返回值也将被写入栈中;
下面介绍一些基础的C++与lua交换的实例:
先上代码:test.lua
function run() print("call from c") print(clib()) end function add(a,b) print("run fun add") return a+b end
C++:
// lua_c.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string> #include <iostream> extern "C"{ #include <lua.h> #include <lualib.h> #include <lauxlib.h> #include <lua.hpp> } using namespace std; #pragma comment(lib,"lua5.1.lib") #pragma comment(lib,"lua51.lib") lua_State *L; //被lua调用的C函数必须定义为 static int xxx(lua_State *L) 的形式 static int clib(lua_State *L) { lua_pushnumber(L,1234); return 1; //返回1 也是有依据的 因为该函数将1个值压入了栈,lua要从里面取出一个值 } int main(int argc, char* argv[]) { int sum; //创建一个指向lua解释器的指针 L=luaL_newstate(); //加载lua标准库 luaL_openlibs(L); //注册C++函数 lua_register(L,"clib",clib); //加载脚本 luaL_dofile(L,"test.lua"); //调用函数 lua_getglobal(L,"run"); lua_pcall(L,0,0,0); //运行函数并把结果压入栈 lua_getglobal(L,"add"); lua_pushnumber(L,2); lua_pushnumber(L,5); lua_pcall(L,2,1,0); sum = (int)lua_tonumber(L, -1); printf("%d\n",sum); //关闭并释放资源 //测试C 读取lua中的元素 lua_pushnumber(L,110); lua_pushstring(L,"hi,panteng"); string name=(string)lua_tostring(L,-1); int age=(int)lua_tonumber(L,-2); cout<<name<<"的年龄是:"<<age<<endl; lua_close(L); printf("Hello World!\n"); return 0; }
首先叙述C++嵌入lua脚本初始化的一些东西:
//创建一个指向lua解释器的指针
L=luaL_newstate();
//加载lua标准库
luaL_openlibs(L);
//加载脚本
luaL_dofile(L,"test.lua");
下面说调用lua函数的过程:
/*------寻找函数-------*/
lua_getglobal(L,"add"); //首先将“run”放到栈顶; 然后寻找 run的值 ; 用run的值替换"run"
/*------参数赋值-------*/
lua_pushnumber(L,2);
lua_pushnumber(L,5);
/*------调用函数-------*/
lua_pcall(L,2,1,0);
/*------取返回值-------*/
int sum = (int)lua_tonumber(L, -1);
下面说lua调用C++中函数的过程:
//在C++中,注册C++函数
lua_register(L,"clib",clib); //建议C++中与lua中的函数名保持一致 不一致的话会不会出问题就不知道了 没有测试过
然后在lua中调用即可
-----后续还有一些关闭L的语句,关闭之前也应该先pop出栈中的数据,这一部分还没搞的太明白,待续……