关于引用
本文通过实际代码描述了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")