您的位置:首页 > 编程语言 > Lua

在Lua中调用c++函数示例

2009-12-14 14:24 756 查看
第一步是定义函数。所有在Lua中被调用的C/C++函数将使用下面一类指针进行调用:

typedef int (*lua_CFunction) (lua_State *L);

从C德角度来看,一个C函数必须要以Lua解释器作为唯一的参数,并且返回一个唯一的表示返回值个数的整数。所以,函数在将返回值入栈之前不需要清理栈,函数返回以后,Lua自动的清理栈中返回结果下面的所有内容。由于用一个Lua解释器作为参数,因此函数实际上能够从栈中取得任意数量的参数。在后面我们将看到,返回的整数实际上是被压入栈的值的个数。通过如此容易的封装,就能满足你在Lua中调用C++函数的需求。

下面给出的C++函数average()演示了如何接受多个参数且返回超过一个值。记住,该函数是一个与上面typedef相匹配的函数。

文件为lua_cFunction.cpp。如果你直接使用C而不是C++,将文件名改为lua_cFunction.c,然后将extern "C"删除。

#include "stdafx.h"
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};
#pragma comment( lib, "lua51.lib")
lua_State* state;

static int average( lua_State* st )
{
int nSize = lua_gettop( st );
double sum = 0;
int i;
for ( i = 1; i <= nSize; i++ )
{
sum += lua_tonumber( st, i );
}

lua_pushnumber( st, sum/nSize );
lua_pushnumber( st, sum );

return 2;
}

int main(int argc, _TCHAR* argv[])
{
state = lua_open();
luaL_openlibs( state );
lua_register( state, "average", average );			//注册函数
luaL_dofile( state, "lua_cFunction.lua" );
lua_close( state );
return 0;
}


下面是以5个参数调用average函数并且显示两个返回值的Lua脚本,我们将其保存为lua_cFunction.lua:

avg,sum = average( 10, 20, 30, 40 )
print("The average is:", avg )
print("The sum is:", sum )


运行结果:

The average is: 25
The sum is: 100

如果你已经阅读了Lua的API文档,你将看出实际上我上面的average函数没有进行错误检查。这样做是为了更容易地讲解,然而在真实的程序中你应该做一些错误检测。在上面的例子中,我们至少应该检查每个参数是不是数字。通过在for循环中添加下面的代码来实现:

if (!lua_isnumber(L, i)) {
lua_pushstring(L, "Incorrect argument to 'average'");
lua_error(L);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: