配置文件处理向来是很麻烦的事情,如果用ini要自己写parser,用xml装个libxml库。
然而在使用awesome的过程中,我发现了他的配置文件是用lua写的,我瞬间想到了wow插件= =
这个"配置文件"里竟然可以定义函数!比xml强大多了!
安装lua后,就会出现lua.h , lualib.h , lauxlib.h这几个库
C++里引用时需要extern "C" 使得编译后的命名方式与C相同
嵌入lua的方式大概就是将lua代码(文件或输入均可)构成一个环境(State)
通过栈的方式取出变量甚至是函数。
下面是个example
#include
#ifdef __cplusplus
extern "C"
{
#endif
#include
#include //这是一个辅助库(auxiliary library),把lua.h里的基本API组合起来方便使用,所有函数以luaL_开头
#include
#ifdef __cplusplus
}
#endif
int main()
{
lua_State *L=lua_open(); //创建一个lua环境
luaL_openlibs(L);//打开基本库,这是lua 5.1下的用法,如果你是旧版的,请升级
luaL_loadfile(L,"aplusb.lua"); //从aplusb.lua文件里读入代码
lua_pcall(L,0,0,0); //"运行"这段代码
lua_getglobal(L,"a"); //获得变量a并塞到栈里
int a=(int)lua_tonumber(L,-1);
/*负数index代表从栈顶开始数,以栈顶为-1
正数则是从栈底开始,比如1就是栈底
将栈顶的变量当作number读取,lua里number的类型都是double
类似的函数还有
int lua_toboolean(lua_State*, int);
const char *lua_tostring(lua_State*, int);
*/
lua_getglobal(L,"b"); //获得变量a并塞到栈里
int b=(int)lua_tonumber(L,-1);
lua_getglobo(L,"add");
lua_pushnumber(L,a);//压入参数
lua_pushnumber(L,b);
lua_pcall(L,2,1,0);//调用两个参数,一个返回值的函数,返回值会被压入栈中
int ans=(int)lua_tonumber(L,-1);
lua_pop(L,1);//把得到的1个结果弹出,以免打乱栈的结构(如果你知道自己在做什么,也可以不用弹出)
printf("%d\n",ans);
}
--aplusb.lua文件的内容~~
a=1
b=2
function add(a,b)
return a+b
end
下面是我偷懒写的几个读入宏..
#define loadi(name) do{\ //读入数字
lua_getglobal(L,#name);\
name=(int)lua_tonumber(L,-1);\
lua_pop(L,1);\
}while(false)
#define load(type,name) do{\ //读入某个类型(表示为lua下的类型,boolean,number,string)
lua_getglobal(L,#name);\
name=(typeof(name))lua_to##type(L,-1);\
lua_pop(L,1);\
}while(false)