如何在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...