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

第一步是定义函数。所有在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);
}

你可能感兴趣的:(C++,c,api,脚本,lua,文档)