1、Lua通过ANSI C 进行编写,Lua与C交互要遵循一定的协议规则。在Lua 5.1 Reference Manual中明确规定如何通过C Code调用Lua 编写的函数。
C code可以调用Lua Code编写的任何函数.本文主要以全局函数来做演示。
2、首先把C语言调用Lua 函数的协议规则说明。Lua 5.1 Reference Manual 中关于void lua_call (lua_State *L, int nargs, int nresults); 函数的描述中详细说明了协议规则。
void lua_call (lua_State *L, int nargs, int nresults);
To call a function you must use the following protocol:
first, the function to be called is pushed onto the stack;
then, the arguments to the function are pushed in direct order;
that is, the first argument is pushed first.
Finally you call lua_call;
nargs
is the number of arguments that you pushed onto the stack.
All arguments and the function value are popped from the stack when the function is called.
The function results are pushed onto the stack when the function returns.
The number of results is adjusted to nresults, unless nresults is LUA_MULTRET.
In this case, all results from the function are pushed. Lua takes care that the returned values fit into the stack space.
The function results are pushed onto the stack in direct order (the first result is pushed first), so that after the call the last result is on the top of the stack.
调用Lua函数必须使用如下协议:1、把函数名称压入到虚拟栈。2,从左到右依次把参数压入到虚拟栈3,调用lua_call()函数。
在lua_call()函数中,nargs指定Lua Code函数的参数数量,nresults指定当Lua Code函数调用完成后向虚拟栈上面压入返回结果的数量。
3、在C code中调用Lua Code全局函数
sample_1.cpp文件
#include
using namespace std;
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
//为了方便说明,在C code中调用Lua Code函数,函数以calllua_XXX命名
int calllua_sum(lua_State *L,int a, int b)
{
//把_G["name"] 函数压入到虚拟栈上面
lua_getglobal(L,"sum");
//按时Lua函数顺序,从左到右依次压入参数
lua_pushnumber(L,a);
lua_pushnumber(L,b);
//调用lua_call()函数,实际调用Lua Code函数
lua_call(L,2,1);
//当Lua Code函数调用结束后,把结果值压入虚拟栈中
int sum=(int)lua_tonumber(L,-1);
return sum;
}
int main(int argc, char **argv)
{ //创建lua_State
lua_State *L = lua_open(); /* create state */
//注册标准库
luaL_openlibs (L);
//执行sample_1.lua
luaL_dofile (L, "sample_1.lua");
//调用Lua Code函数
int sum =calllua_sum(L,1, 2);
cout<<"sum:"<
sample_1.lua 文件
print("example_1.lua")
--定义全局变量 sum函数
function sum(a,b)
return a+b
end
4、在C code中调用Lua Code中任何函数。以Table中Field函数为例子
int calllua_fieldsum(lua_State *L,int a, int b)
{
//把_G["luaTable"] Table数据结构压入到虚拟栈上面
lua_getglobal(L,"luaTable");
//把luaTable["fieldsum"]函数压入到虚拟栈上面
lua_getfield(L,-1,"fieldsum");
//把_G["luaTable"]从虚拟栈中移除
lua_remove(L,-2);
//按时Lua函数顺序,从左到右依次压入参数
lua_pushnumber(L,a);
lua_pushnumber(L,b);
//调用lua_call()函数,实际调用Lua Code函数
lua_call(L,2,1);
//当Lua Code函数调用结束后,把结果值压入虚拟栈中
int sum=(int)lua_tonumber(L,-1);
return sum;
}
--定义一个全局Table
luaTable={}
--在Table字段中定义函数
luaTable["fieldsum"]=function(a,b) return a+b end
在Lua与C/C++语言交互时,通过C调用Lua Code函数是最简单的一种。因为Lua C API 为了C语言而设计,C++又包含C语言,所以在调用Lua Code函数时原理都一直。
不过C++,提供了在编译时的模板机制,可以更大的灵活性。同时在lua_pushXXX()函数中,仅仅提供几种基本的数据类型,这个可以自己扩展。