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