如何在C 中整合Lua指令碼 LuaPlus篇

2021-04-20 03:52:42 字數 4352 閱讀 8975

如何在c++中整合lua指令碼(luaplus篇)

去年我作了乙個lua指令碼的c++包裝,有許多朋友感興趣,並嘗試使用,我感到受寵若驚。事實上,我作的包裝,學習的目的比較強,它還是有許多缺陷的。為了讓朋友們少走彎路,我推薦使用luaplus作為c++的包裝。

luaplus是lua的c++增強,也就是說,luaplus本身就是在lua的原始碼上進行增強得來的。用它與c++進行合作,是比較好的乙個選擇。

luaplus目前版本為:luaplusfor lua 5.01 distribution build 1080 (february 28, 2004)。大家可以到http://luaplus.org/

)目標碼 (http://wwhiz.com/luaplus/luaplus50_build1081_win32binaries.zip

)我將在下面說明,如何使用luaplus,以及如何更方便的讓luaplus與c++的類合作無間。

1. 呼叫lua指令碼

// 建立lua直譯器:

luastateowner state;

// 執行lua指令碼:

state->dostring("print('hello world/n')");

// 載入lua指令碼檔案並執行:

state->dofile("c://test.lua");

// 載入編譯後的lua指令碼檔案並執行:

state->dofile("c://test.luac");

2. 與lua指令碼互相呼叫

// 為lua指令碼設定變數

state->getglobals().setnumber("myvalue", 123456);

// 獲得lua變數的值

int myvalue = state->getglobal("myvalue").getinteger();

// 呼叫lua函式

luafunctionluaprint = state->getglobal("print");

luaprint("hello world/n");

// 讓lua呼叫c語言函式

int add(int a, int b)

state->getglobals().registerdirect("add", add);

state->dostring("print(add(3,4))");

// 讓lua呼叫c++類成員函式

class test};

test test;

state->getglobals().registerdirect("add", test, add);

state->dostring("print(add(3,4))");

3. 在lua指令碼中使用c++類

這個稍微有點小麻煩。不過,我包裝了乙個luaplushelper.h的檔案,它可以很輕鬆的完成這個工作。它的實現也很簡單,大家可以從原始碼上來獲得如何用純luaplus實現同樣的功能。

不過,這裡仍然有乙個限制沒有解決:不能使用虛成員函式。不過考慮到我們僅是在lua呼叫一下c++函式,並不是要將c++完美的匯入到lua,這個限制完全可以接受。

另外,類成員變數不能直接在lua中訪問,可以通過類成員函式來訪問(比如setvalue/getvalue之類)。

// 下面是乙個簡單的c++類:   

class logger

logger()

virtual ~logger()

logger(int n)

logger(logger* logger)

int setvalue(int val)

int getvalue()

public:

int v;

};// 匯入到lua指令碼:

luaclass(state)

.create("logger") // 定義建構函式 logger::logger()

.create("logger2")  // 定義建構函式 logger::logger(int)

.create("logger3") // 定義建構函式 logger::logger(logger*)

.destroy("free")  // 定義析構函式 logger::~logger()

.destroy("__gc")  // 定義析構函式 logger::~logger()

.def("lm", &logger::logmember)  // 定義成員函式 logger::logmember(const char*)

.def("setvalue", &logger::setvalue)

.def("getvalue", &logger::getvalue);

// 在lua中使用logger類(1):

state->dostring(

"l = logger();"  // 呼叫建構函式 logger::logger()

"l.lm('hello world 1');"  // 呼叫成員函式 logger::logmember(const char*)

"l.free();"  // 呼叫析構函式 logger::~logger()

);// 在lua中使用logger類(2):

state->dostring(

"m = logger(10);" // 呼叫建構函式 logger::logger(int)

"m.lm('hello world 2');"  // 呼叫成員函式 logger::logmember(const char*)

"n = logger(m);" // 呼叫建構函式 logger::logger(logger*)

"n.lm('hello world 3');"  // 呼叫成員函式 logger::logmember(const char*)

"m.setvalue(11);"

"print(m.getvalue());"

"m,n = nil, nil;" // m,n 將由lua的垃极**來呼叫析構函式

);4. 將一組c函式歸類到lua模組

//同上面一樣,我採用luaplushelper.h來簡化:

luamodule(state, "mymodule")

.def("add", add)

.def("add2", test, add);

state->dostring(

"print(mymodule.add(3,4));"

"print(mymodule.add2(3,4));"

);5. 使用lua的table資料型別

// 在lua中建立table

luaobject table = state->getglobals().createtable("mytable");

table.setinteger("m", 10);

table.setnumber("f", 1.99);

table.setstring("s", "hello world");

table.setwstring("ch", l"你好");

table.setstring(1, "what");

// 相當於lua中的:

// mytable =

// 也可以使用table作為key和value:

state->getglobals().createtable("nexttable")

.setstring(table, "hello")

.setobject("obj", table);

// 相當於lua中的:

// nexttable =

//獲得table的內容:

luaobject t2 = state->getglobals("mytable");

int m = t2.getbyname("m").getinteger();

luaobject t3 = state->getglobals("nexttable");

std::string str = t3.getbyobject(t2).getstring();

6  遍歷table

luastateowner state;

state.dostring( "mytable = " );

luaobject obj = state.getglobals()[ "mytable" ];

for ( luatableiterator it( obj ); it; it.next() )

篇尾上面我只是簡單的舉一些例子來說明luaplus以及luaplushelper的使用方法,具體文件請參見luaplus

如何在C 中整合Lua指令碼

如何在c 中整合lua指令碼 logger virtual logger logger int n logger logger logger int setvalue int val int getvalue public int v 匯入到lua指令碼 luaclass state create ...

如何在C 中整合Lua指令碼 LuaPlus篇

去年我作了乙個lua指令碼的c 包裝,有許多朋友感興趣,並嘗試使用,我感到受寵若驚。事實上,我作的包裝,學習的目的比較強,它還是有許多缺陷的。為了讓朋友們少走彎路,我推薦使用luaplus作為c 的包裝。我將在下面說明,如何使用luaplus,以及如何更方便的讓luaplus與c 的類合作無間。1....

在vs中整合lua開發環境

1.在vs中選擇工具 外部工具,新增乙個外部工具 命令 lua直譯器,即安裝lua目錄中的lua.exe 引數 要編譯的lua原始檔位置,格式 f test itemfilename itemext 意思就是編譯f test 下的所有lua檔案,其中 itemfilename 表示檔名,itemex...