引用:http://blog.chinaunix.net/uid-52437-id-2108806.html
在Lua代码中调用C/c++函数对Lua来说至关重要,让Lua能真正站到C这个巨人的肩膀上。
要写一个能让Lua调用的C/c++函数,就要符合lua_CFunction定义:typedef int (*lua_CFunction) (lua_State *L);当Lua调用C函数的时候,同样使用栈来交互。C函数从栈中获取她的参数,调用结束后将结果放到栈中,并返回放到栈中的结果个数。
这儿有一个重要的概念:用来交互的栈不是全局栈,每一个函数都有他自己的私有栈。当Lua调用C函数的时候,第一个参数总是在这个私有栈的index=1的位置。
- ...
- #include <complex> //复数
- //C函数,做复数计算,输入实部,虚部。输出绝对值和角度
- int calcComplex(lua_State *L)
- {
- //从栈中读入实部,虚部
- double r = luaL_checknumber(L,1); //判断栈第1个值是不是数据,如果是就返回这个数字;
- double i = luaL_checknumber(L,2); //判断栈第2个值是不是数据,如果是就返回这个数字;
- complex<double> c(r,i);
- //存入绝对值
- lua_pushnumber(L,abs(c)); //把abs(c)计算的结果放到栈中,这是规定,看上面粗体字;
- //存入角度
- lua_pushnumber(L,arg(c)*180.0/3.14159);
- return 2;//两个结果 //返回存入栈中结果个数,这也是规定,看上面粗体字;
- }
- int main()
- {
- char *szLua_code =
- "v,a = CalcComplex(3,4) "
- "print(v,a)";
- lua_State *L = luaL_newstate(); ///初始化lua环境,加载了5.1版本的所有程序库
- luaL_openlibs(L); //分开加载库听说因为是io库有个bug;
- //放入C函数
- lua_pushcfunction(L, calcComplex); //把一个c函数放到栈中
- lua_setglobal(L, "CalcComplex"); //从栈中pop一个值出来,并命名为"CalcComplex"供lua调用;
- //执行
- bool err = luaL_loadstring(L, szLua_code)||lua_pcall(L, 0, 0, 0);//lua_pcall()是判断执行lua语句是否有错,成功为0
- if(err)
- {
- cerr << lua_tostring(L, -1);
- lua_pop(L, 1);
- }
- lua_close(L);
- return 0;
- }
#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
这两句代码也就可写成lua_register(L,"CalcComplex",calcComplex);