LUA和C++ 之间的函数调用是应用最广的,调用方式也和丰富。
1.全局函数被Lua语句调用
#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"
#define LUA_OK 0
void show(int a, int b){ cout<<"C函数在Lua内打印"<<a+b<<endl;}
int main()
{
LuaStateOwner state;
// 执行Lua脚本:
state->DoString("print('欢迎 World\\n')");
//注册C语言函数到Lua中
state->GetGlobals().RegisterDirect("add", show);
state->DoString("add(4,7)");
}
全局函数show在Lua中可以换个名字调用,利用RegisterDirect()函数将show注册到脚本中以add取代之。然后在脚本中执行add函数,得到的结果和执行show是一样的。
2.对.lua脚本文件中的函数调用
1)在Lua脚本内执行。
对于Lua中的函数的调用方式也很多,就举几个例子吧。还是上免得程序不变,只更改.Lua文件中的内容
function Add(x, y)
return x+y;
end
print(Add(3,5));
运行结果,屏幕上会输出8.
2)在Lua脚本内的函数被C++执行。
除了可以在Lua内中执行以外,还可以在C++环境中执行。把上面的那个Lua文件最后的那行打印语句删掉,用下面的C++语句调用Add函数。
#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"
#define LUA_OK 0
int main()
{
LuaStateOwner state;
state->DoFile("test.lua");
LuaFunction<float> luaAdd = state->GetGlobal("Add");
float i = luaAdd(1.1f,1.0f);
cout<<"Lua 内部函数返回 = "<<i<<endl;
return 0;
}
还有一种方法,直接用DoString语句调用。
#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"
#define LUA_OK 0
int main()
{
LuaStateOwner state;
state->DoFile("test.lua")
state->DoString("print(Add(3,4))");
return 0;
}
结果是一样的。
3)C++函数被Lua脚本内的函数执行。
这个调用就有点意思了,在Lua脚本里可以这么写
function Add(x, y)
PrintNumber(x,y);
end
也就是Add函数调用了一个名字叫PrintNumber()的函数。而这个PrintNumber函数在哪里呢?让我们看看C++代码
#include <iostream>
using namespace std;
#include "..\..\LuaPlus\src\LuaPlus\LuaPlus.h"
#define LUA_OK 0
void Show(int x,int y) {cout<<"x+y="<<x+y<<endl;}
int main()
{
LuaStateOwner state;
state->DoFile("test.lua");
state->GetGlobals().RegisterDirect("PrintNumber", Show);
state->DoString("Add(3,4)");
return 0;
}
原来PrintNumber只是一个中间字符串,他指向了C++函数Show();