在Lua代码中调用c/C++函数

来源:互联网 发布:2017编程语言趋势 编辑:程序博客网 时间:2024/05/16 19:31

引用: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的位置。

  1. ...
  2. #include <complex> //复数
  3.  
  4. //C函数,做复数计算,输入实部,虚部。输出绝对值和角度
  5. int calcComplex(lua_State *L)
  6. {
  7.     //从栈中读入实部,虚部
  8.     double r = luaL_checknumber(L,1);  //判断栈第1个值是不是数据,如果是就返回这个数字;
  9.     double i = luaL_checknumber(L,2);//判断栈第2个值是不是数据,如果是就返回这个数字;
  10.     complex<double> c(r,i);
  11.     //存入绝对值
  12.     lua_pushnumber(L,abs(c));//把abs(c)计算的结果放到栈中,这是规定,看上面粗体字;
  13.     //存入角度
  14.     lua_pushnumber(L,arg(c)*180.0/3.14159);
  15.     return 2;//两个结果  //返回存入栈中结果个数,这也是规定,看上面粗体字;
  16. }
  17.  
  18. int main()
  19. {
  20.     char *szLua_code =
  21.         "v,a = CalcComplex(3,4) "
  22.         "print(v,a)";
  23.  
  24.     lua_State *L = luaL_newstate(); ///初始化lua环境,加载了5.1版本的所有程序库
  25.     luaL_openlibs(L);//分开加载库听说因为是io库有个bug;
  26.    
  27.     //放入C函数
  28.     lua_pushcfunction(L, calcComplex);  //把一个c函数放到栈中
  29.     lua_setglobal(L, "CalcComplex");//从栈中pop一个值出来,并命名为"CalcComplex"供lua调用;
  30.    
  31.     //执行
  32.     bool err = luaL_loadstring(L, szLua_code)||lua_pcall(L, 0, 0, 0);//lua_pcall()是判断执行lua语句是否有错,成功为0
  33.     if(err)
  34.     {
  35.         cerr << lua_tostring(L, -1);
  36.         lua_pop(L, 1);
  37.     }
  38.  
  39.     lua_close(L);
  40.     return 0;
  41. }
    结果返回5 53.13...,和其它数据一样,给Lua代码提供C函数也是通过栈来操作的,因为lua_pushcfunctionlua_setglobal的 组合很常用,所以Lua提供了一个宏:
    #define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
    这两句代码也就可写成lua_register(L,"CalcComplex",calcComplex);

0 0
原创粉丝点击