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();