关于引用

本文通过实际代码描述了C与lua的引用

c代码:


#include "windows.h"
#include <iostream.h> 
 
extern "C"{  
#include "lua.h"   
#include "lualib.h" 
#include "lauxlib.h"  
} 
 
 
#pragma   comment(lib,"lua5.1.lib") 
 
 
lua_State * L; 
 
static int clib(lua_State *L)   //给lua调用的c函数必须定义成static int XXX(lua_State *L) 
{ 
 const char *buff = luaL_checkstring(L, -1);
 //从栈顶弹出一个值
 lua_pop(L, 1); 
        //lua_pop(L, -1); //清栈

 //创建索引并从栈顶弹出该对象
 int ref = luaL_ref(L, LUA_REGISTRYINDEX);
 //根据索引取lua对象并压栈
 lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
 if (!lua_isfunction(L, -1))
 {
  printf("call back function is not valid:%d", ref);
  return 0;
 }
 //压入参数
 lua_pushstring(L, buff);
 //运行
 lua_pcall(L, 1, 0,0);
 const char * err = luaL_checkstring(L, 1);
 printf("%d,err:%s/n", lua_gettop(L),  err);
 luaL_unref(L, LUA_REGISTRYINDEX, ref);
    return 0;   //为什么要返回1?这是有依据的,该函数把结果压入了栈,lua调用该函数将从栈中 
//取1个结果  */
} 
 

static const luaL_reg lengine[] = {
 {"clib", clib},
 {NULL, NULL},
};
 
int main ( int argc, char *argv[] ) 
{ 
    //创建一个指向lua解释器的指针 
    L = luaL_newstate(); 
    //加载lua标准库 
    luaL_openlibs(L); 
         //注册C++函数 
    lua_register(L,"clib",clib); 
    //加载脚本 
 luaL_register(L, "lengine", lengine);
 luaL_dofile(L,"1.lua"); 
    //调用函数 
   // lua_getglobal(L,"run"); 
         //运行函数并把结果压入栈 
   // lua_pcall(L,0,0,0); 
    //关闭并释放资源 
    lua_close(L);
    return 0; 
} 

lua代码:


local b = {}
function b.a(str)
 print("OK")
 print("lua" .. str)
end

lengine.clib(b.a, "test")

留下只言片语: