c调用lua
介绍一本lua的书 <lua程序设计 第二版>,书的作者就是lua 的作者.可想 书的 含金量.
如果 博友 看不懂 底下的 知识点,请研读 上面的 书.
切记,欲速则不达.
c 调用 lua 有几个方面的 知识点:
1. 获取 和 设置 lua 全局变量
2.调用 lua 函数
3. lua table 操作
1.获取 和 设置 lua 全局变量,通过 lua_getglobal,lua_setglobal 获取lua 全局 变量
2.调用lua 函数:1.获取 全局 函数 2. 传参数: lua_pushxxx 3. lua_pcall 执行 lua函数
3.lua table 操作 :包括 获取 table 里的 值 和 设置 table 里的值
3.1获取: 1.获取 全局table 2.通过lua_getfield获取
3.2 设置 : 1. 传值 2. 设置 lua_setfield
直接 上代码:
1.在工程 源码 下 新建 一个 test.lua
a = 10b = 20print(a+b)
function add(a,b)return a + bend
luaTable = {name = "fu",score = 100}
2.新建 win32控制台程序 ,在
#include "stdafx.h"
#include <stdlib.h>
#include <stdlib.h>
#include <string>//加入 lua 动态链接库#pragma comment(lib,"lua51")extern "C"{
#include "lua\lua.h"#include "lua\lualib.h"#include "lua\lauxlib.h"
}using namespace std;
extern void error(lua_State *,const char *,...);
int _tmain(int argc, _TCHAR* argv[]){
lua_State * l = luaL_newstate();luaL_openlibs(l);if (luaL_loadfile(l,"test.lua") || lua_pcall(l,0,0,0))//执行test.lua{
error(l,"error : %s",lua_tostring(l,-1));
}//获取lua 变量 a,blua_getglobal(l,"a");lua_getglobal(l,"b");int a,b;if (lua_isnumber(l,-1) && lua_isnumber(l,-2)){
b = lua_tonumber(l,-1);a = lua_tonumber(l,-2);printf("获取变量a,b:%d\t%d\n",a,b);
}//获取 lua 函数 addlua_getglobal(l,"add");lua_pushinteger(l,a);lua_pushinteger(l,b);if (lua_pcall(l,2,1,0)){
error(l,"执行lua add函数 报错:%s",lua_tostring(l,-1));
}if (lua_isnumber(l,-1)){
int sum = lua_tonumber(l,-1);printf("执行lua add函数 sum: %d\n",sum);lua_pop(l,1);
}
//获取 和 设置 lua tablelua_getglobal(l,"luaTable");lua_getfield(l,-1,"name");//获取if (lua_isstring(l,-1)){
string s = lua_tostring(l,-1);lua_pop(l,1);printf("获取table的值:%s \n",s.c_str());
}//设置lua_pushstring(l,"li");lua_setfield(l,-2,"name");//验证lua_getglobal(l,"luaTable");lua_getfield(l,-1,"name");if (lua_isstring(l,-1)){
string s = lua_tostring(l,-1);lua_pop(l,1);printf("设置table的值:%s :",s.c_str());
}lua_close(l);return 0;
}
//lua 执行错误后,打印错误信息, 关闭 luaState,退出程序void error(lua_State * l,const char * formart,...){
va_list args;va_start(args,formart);vfprintf(stderr,formart,args);va_end(args);lua_close(l);exit(-1);
}