现在的位置: 首页 > 综合 > 正文

C/C++中嵌入Lua–转自bbs.luachina.net

2013年11月02日 ⁄ 综合 ⁄ 共 2065字 ⁄ 字号 评论关闭
Calling Lua Functions
这一篇接着第一个篇"Hello, World!",介绍如何在Lua中定义函数然后在C/C++中调用他,这将涉及到参数传递,返回值,全局变量等。
Lua中定义函数非常简单,以关键字function开头,后面跟上函数名,参数列表,函数体,函数定义以end结尾。Lua中函数可以传递多个参数也可有多个返回值。
下面有个简单的Lua函数,两个数字相加返回两者的和。
代码:
	-- add two numbers

	function add ( x, y )
	return x + y
		 end

在上一篇中我们讲到调用lua_dofile()将加载并运行Lua代码,本节中我们的Lua脚本仅仅定义了一个函数,调用lua_dofile()函数将使得我们的C/C++程序可以访问Lua中的函数了。
Lua中的函数可以接受多个参数,也可以有多个返回值。这是通过stack来完成的。调用一个函数时,首先将函数放到栈顶,接着按顺序放入函数的参数,当我们调用函数lua_call()之后,函数的返回值已经放在栈顶了,这些步骤在下面的luaadd()函数中可以看到。
说明:
1. 调用lua_getglobal()将add()函数压入栈顶。
2. 第一个参数x,通过调用lua_pushnumber()入栈。
3. 再次调用lua_pushnumber()将第二个参数入栈。
4. 使用lua_call()调用Lua函数。
5. 调用lua_tonumber()从栈顶取得函数的返回值。
6. lua_pop()移除栈顶的值。
将下面的代码保存为luaadd.cpp,如果你喜欢用C而不是C++,需要保存文件为luatest.c并且把extern去掉。

代码:
#include <stdio.h>

extern "C" {
	#include "lua.h"
	#include "lualib.h"
	#include "lauxlib.h"
}

/* the Lua interpreter */
lua_State* L;

int luaadd ( int x, int y )
{
	int sum;

	/* the function name */
	lua_getglobal(L, "add");

	/* the first argument */
	lua_pushnumber(L, x);

	/* the second argument */
	lua_pushnumber(L, y);

	/* call the function with 2
	   arguments, return 1 result */
	lua_call(L, 2, 1);

	/* get the result */
	sum = (int)lua_tonumber(L, -1);
	lua_pop(L, 1);

	return sum;
}

int main ( int argc, char *argv[] )
{
	int sum;
	
	/* initialize Lua */
	L = lua_open();

	/* load Lua base libraries */
	lua_baselibopen(L);

	/* load the script */
	lua_dofile(L, "add.lua");
	
	/* call the add function */
	sum = luaadd( 10, 15 );

	/* print the result */
	printf( "The sum is %d/n", sum );

	/* cleanup Lua */
	lua_close(L);

	return 0;
}

编译:
Linux平台,键入命令:

代码:
g++ luaadd.cpp -llua -llualib -o luaadd

运行程序:

代码:
./luaadd


如果正常的话程序应该显示:"The sum is 25"
如果你不是Linux操作系统,使用的是Vc++编译器,你需要:
1. 创建一个新的win32控制台应用工程。
2. 将文件luaadd.cpp添加到你的工程中。
3. 到Project, Settings点击Link页。
4. 添加lua+lib.lib到Object/library modules列表中。
5. 按F7编译程序。
运行程序以前,你需要确保lua+lib.dll文件放在windows可以找到的地方,将这个文件从C:/Program Files/Lua-5.0拷贝到Visual C++ project目录,如果编译没有错误的话,现在可以Ctrl+F5运行程序了。
关于全局变量:
如上面我们所看到的,lua_getglobal()将Lua的一个全局变量放至栈顶,假如我们的脚本包含一个全局变量z,下面这段代码将获取z的值:

代码:
lua_getglobal(L, "z");
	z = (int)lua_tonumber(L, 1);
	lua_pop(L, 1);

与之对应的lua_setglobal()用来设置Lua的一个全局变量的值,下面的这段代码将全局变量z的值设置为10

代码:
lua_pushnumber(L, 10);
	lua_setglobal(L, "z");

注意,不需要在你的Lua脚本中显式的全局变量,如果全局变量不存在,lua_setglobal()将创建一个新的全局变量。

关于Lua得更多内容请看bbs.luachina.net

抱歉!评论已关闭.