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