在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"删除。
下面是以5个参数调用average函数并且显示两个返回值的Lua脚本,我们将其保存为lua_cFunction.lua:
运行结果:
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);
}
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);
}
相关文章推荐
- VC6.0配置LUA编译环境及LUA调用C++函数的简单示例
- Lua中调用C++函数示例
- VC6.0配置LUA编译环境及LUA调用C++函数的简单示例
- cocos2d-x 3.0 在C++中调用lua函数(2)
- 6.Lua调用c++函数传递普通参数
- lua调用C++函数崩溃时,查看lua的调用栈信息(特别适用于tolua++)
- cocos2dx关于在c/c++中调用lua函数
- Lua入门之二:C/C++ 调用Lua及多个函数返回值的获取
- Lua与C/C++的交互5:C/C++调用Lua函数
- 如何在c/c++中调用LUA函数
- 【木头Cocos2d-x 030】Lua篇(第05章):C++调用Lua的函数
- Lua教程(四):在Lua中调用C语言、C++的函数
- 【走进Lua的世界之五】C++调用Lua函数
- C++调用LUA函数,可变参模板实现
- cocos2d-x 3.0 在C++中调用lua函数
- lua脚本调用C++动态库中的函数
- c++调用lua 函数之 lua_API
- 简单C++调用lua函数及C++和lua相互函数调用小例子
- 【木头Cocos2d-x 031】Lua篇(第06章):Lua调用C++的函数
- C++中调用Lua函数实例