lua 与 C++的交互

lua 与 C++的交互

我发现踩完坑,编译完。。 之后我就忘记了。 

把尽可能记得的有点用的东西记录下把

  • 1.1 简述
  • 1.2 Lua栈操作
    • 1.2.1Pushing Elements
    • 1.2.2 Querying Elements
    •  1.2.3 Other Stack Operations
  • 1.3 Lua value 和 C value对应

·  debug方案 

·  参考文献

1.C++如何和lua交互

1.1 简述

  • Lua和C/c++语言通信的主要方法是一个无处不在的虚拟栈lua_State *L
    • 堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶

 

  • 需要在Lua里面调用c/c++ 的函数必须满足以下格式:typedef int (*lua_CFunction) (lua_State *L); 即必须接收一个lua_State作为参数,同时返回一个整数值。(表示函数返回时有多少返回值被压入Lua栈) 
  • lua知道C++的函数,向lua注册一个函数,内部实现是以函数指针的形式:lua_register(Lua, "函数名字",函数指针);

 

 

 

1.2 Lua栈操作

 

1.2.1Pushing Elements

 展开源码

        void lua_pushnil (lua_State *L);
    void lua_pushboolean (lua_State *L, int bool);
    void lua_pushnumber (lua_State *L, double n);
    void lua_pushlstring (lua_State *L, const char *s, size_t length);
    void lua_pushstring (lua_State *L, const char *s); // 压入字符串,使用strlen自动计算长度


1.2.2 Querying Elements

int lua_is... (lua_State *L, int index);

注意:`lua_to***`系列函数只是读取栈内的内容,并不会修改栈的内容

 展开源码

    int            lua_toboolean (lua_State *L, int index);
    double         lua_tonumber (lua_State *L, int index);
    const char    *lua_tostring (lua_State *L, int index);
    size_t         lua_strlen (lua_State *L, int index);
-----
    lua_CFunction lua_tocfunction (lua_State *L, int index); // 把给定索引处的 Lua 值转换为一个 C 函数。 这个值必须是一个 C 函数;如果不是就返回 NULL 。
    const void *lua_topointer (lua_State *L, int index); //把给定索引处的值转换为一般的 C 指针 (void*) 。 这个值可以 userdata ,table ,thread 或是一个 function ; 否则,lua_topointer 返回 NULL 
    void *lua_touserdata (lua_State *L, int index); //如果索引处的值是完整的 userdata ,返回内存块的地址。 如果值是一个 light userdata ,那么就返回它表示的指针。 否则返回 NULL 。

 1.2.3 Other Stack Operations

    int   lua_gettop (lua_State *L);  // 该函数返回当前lua状态栈的大小
    void  lua_settop (lua_State *L, int index); // 设置index位置为栈顶,多余元素被干掉,出现空缺的话补nil 
    void  lua_pushvalue (lua_State *L, int index); // 把index处值的副本压入栈顶
    void  lua_remove (lua_State *L, int index); // 移除index处的值,上面的元素下移一位
    void  lua_insert (lua_State *L, int index); //在index处插入栈顶元素,其上的元素上移一位
    void  lua_replace (lua_State *L, int index); //把栈顶元素设置到index处,原值被覆盖
    void lua_pop(lua_State* lua, int count)宏,从栈中弹出count个元素,等价于lua_settop(lua, -1 - count)
-- 
int lua_is***(lua_State* lua, int index) 判断lua栈中index位置的元素是否是***, 同上,不再枚举
int lua_type(lua_State* lua, int index) 返回index位置元素的类型,具体取值范围请参见lua.h, 如LUA_TNUMBER
const char* lua_typename(lua_State* lua, int type) // 返回type常量对应的元素类型名称
 

1.3 Lua value 和 C value对应

 

           c

         lua

         nil

          无

   {value=0, tt = t_nil}

      boolean

      int  非0, 0

   {value=非0/0, tt = t_boolean}

      number

      int/float等   1.5

   {value=1.5, tt = t_number}

   lightuserdata

   void*, int*, 各种*  point

   {value=point, tt = t_lightuserdata}

      string

         char  str[]

   {value=gco, tt = t_string}   gco=TString obj

      table

           无

   {value=gco, tt = t_table}  gco=Table obj

      userdata

           无

   {value=gco, tt = t_udata} gco=Udata obj

      closure

           无

   {value=gco, tt = t_function} gco=Closure obj

debug方案 

  1. 打开coredump   :  ulimit -c unlimited
  2. 编译g++ 时 打开 -g 模式 
  3. gbd 调试  gdb licenseCheckerSo.so core.23146  

 

参考文献

http://gamedevgeek.com/tutorials/calling-c-functions-from-lua/

http://acamara.es/blog/2012/08/calling-c-functions-from-lua-5-2/

https://www.cnblogs.com/sevenyuan/p/4511808.html

 


 

 

你可能感兴趣的:(lua)