C/C++ 中使用lua作为配置文件

配置文件处理向来是很麻烦的事情,如果用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)




更复杂的功能还未学习,留个坑在这儿。

你可能感兴趣的:(C++,lua,C)