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​