1、首先是準備Lua庫,官方提供了5.1版庫,可是因爲官方的失誤,致使存在2個dll文件,缺一不可,大麻煩。 less
好在Lua是開源的,咱們能夠本身編譯。參看:http://my.oschina.net/u/580100/blog/108468 函數
2、而後準備Lua代碼文件,本身隨便寫個吧,好比下面這個求階乘:test.lua lua
function func1 (n) if n == 0 then return 1 else return n * func1 (n - 1) end end
3、具體在C語言中調用的細節以下: spa
一、包含頭文件 .net
#include "Lua\Lua.h" #include "Lua\LuaLib.h" #include "Lua\LauxLib.h"二、建立 Lua 庫指針,並加載庫
pLua = luaL_newstate(); /* 建立Lua接口指針 */ if(pLua == NULL) return 0; luaL_openlibs(pLua); /* 加載Lua庫 */三、讀取 Lua 代碼文件
if(luaL_loadfile(pLua, "test.lua") != 0) /* 讀取lua源文件,僅載入內存而未編譯 */ return 0; lua_pcall(pLua, 0, LUA_MULTRET, 0); /* 執行匿名函數,以編譯源代碼成二進制碼 */ /* 並將全局變量壓棧(函數名也是變量)。*/ /* 這句看似無用,可是不能省 */ lua_getglobal(pLua, "func1"); /* 取全局變量,這裏是待調用函數名 */四、調用函數,完成功能
lua_pushnumber(pLua, x); /* 參數壓棧。x 爲事先定義的變量 */ if(lua_pcall(pLua, 1, 1, 0) != 0) /* 執行函數 */ { printf("\nError running function 'func1' : %s", lua_tostring(pLua, -1)); return 0; } r = lua_tonumber(pLua, -1); /* 取棧頂值,並轉成數字格式。r 爲事先定義的變量 */ lua_pop(pLua, 1); /* 棧頂彈出一個元素,即清除返回值佔用的棧空間 */這裏值得一提的是 函數 lua_pcall 的參數,第二個是參數個數,第三個是返回值個數,第四個是個函數指針,咱們始終置0。
五、最後記得清理 指針
lua_close(pLua);
#include <stdio.h> #include <stdlib.h> #include <Lua\Lua.h> #include <Lua\LuaLib.h> #include <Lua\LauxLib.h> int main() { int x; long int r; lua_State *pLua; pLua = luaL_newstate(); /* 建立Lua接口指針 */ if(pLua == NULL) return 0; luaL_openlibs(pLua); /* 加載Lua庫 */ if(luaL_loadfile(pLua, "test.lua") != 0) /* 讀取lua源文件,僅載入內存而未編譯 */ return 0; lua_pcall(pLua, 0, LUA_MULTRET, 0); /* 執行匿名函數,以編譯源代碼成二進制碼,*/ /* 並將全局變量壓棧(函數名也是變量) */ lua_getglobal(pLua, "func1"); /* 取全局變量,這裏是待調用函數名 */ printf("Enter a number (less than 13) : "); scanf("%d", &x); lua_pushnumber(pLua, x); /* 參數壓棧 */ if(lua_pcall(pLua, 1, 1, 0) != 0) /* 執行函數 */ { printf("\nError running function 'func1' : %s", lua_tostring(pLua, -1)); return 0; } r = lua_tonumber(pLua, -1); /* 取棧頂值,並轉成數字格式 */ lua_pop(pLua, 1); /* 棧頂彈出一個元素,即清除返回值佔用的棧空間 */ printf("%d! = %ld", x, r); lua_close(pLua); return 0; }