Lua 提供了强大的API用于与C间的交互,两者值间的传递通过虚拟堆栈来实现。
一. 实现Lua解释器
/** * Lua 解释器 */ int main( int argc, char **argv ) { // 初始化解释器 lua_State *pl = luaL_newstate(); // 加载基础库,包括io,os,math等 luaL_openlibs( pl ); // 执行lua脚本 luaL_dofile( pl, "./hello.lua" ); lua_close( pl ); return 0; }
上述少许代码实现了lua解释器,运行打印hello world。
二. C调用Lua函数
2.1 Lua函数实现
-- add function add( x, y ) return x + y end
2.2 调用Lua函数
/** * lua通过虚拟堆栈来传递值 * */ int luaadd( lua_State *l, int x, int y ) { // 通过lua中的add() lua_getglobal( l, "add" ); // 参数x入栈 lua_pushnumber( l, x ); // 通统y入栈 lua_pushnumber( l, y ); // 调用,nargs=2,nresults=1 lua_call( l, 2, 1 ); // 强转(栈顶元素) int sum = (int)lua_tointeger( l, -1 ); // 堆栈平衡 lua_setglobal( l, "add ); return sum; } /** * C调用lua测试 * */ int Calllua_test() { // init lua_State *l = luaL_newstate(); luaL_openlibs( l ); // 执行lua脚本 luaL_dofile( l, "./add.lua" ); // 调用lua的add() int sum = luaadd( l, 10, 15 ); printf( "Lua add: %d\n", sum ); lua_close( l ); return 0; }
执行结果:
Lua add: 25
三. Lua调用C
3.1 Lua调用代码
-- average function main() local avg, sum = average( 2, 2, 3, 5 ) print( "avg: ", avg ) print( "sum: ", sum ) end main()
3.2 C平均值实现
/** * 求取平均数 */ static int average( lua_State *l ) { // 获取参数个数 int n = lua_gettop( l ); double sum = 0; int i = 0; for( i=1; i<=n; i++ ) { sum += lua_tonumber( l, i ); } // 压入平均值 lua_pushnumber( l, sum/n ); // 压入和 lua_pushnumber( l, sum ); // 返回值个数 return 2; } /** * Lua调用C测试 * */ int Callc_test() { // init lua_State *l = luaL_newstate(); luaL_openlibs( l ); // register lua_register( l, "average", average ); // do luaL_dofile( l, "./avg.lua" ); lua_close( l ); return 0; }
执行结果:
avg: 3.0 sum: 12.0
参数链接:
http://www.lua.org/manual/5.3/manual.html
http://www.jb51.net/article/72661.htm