近日時間比較充裕,學習一下lua語言,順便寫下筆記,方便以後加深學習。
為了方便,我沒有編譯lua代碼,直接下載了lua的動態庫及執行檔案
連結地址:
C/C++調用lua動態庫及標頭檔地址(用於C/C++嵌入Lua指令碼解析):
http://sourceforge.net/projects/luabinaries/files/5.1.4/Windows%20Libraries/lua5_1_4_Win64_dll8_lib.zip/download(下載這個版本需要在VS2005下編譯)
也可以到http://luabinaries.sourceforge.net/download.html或http://www.lua.org找適合自己的版本。
lua指令碼解析器地址:
http://en.sourceforge.jp/frs/g_redir.php?m=jaist&f=%2Fluabinaries%2F5.2%2FExecutables%2Flua-5.2_Win32_bin.zip
一、"hello world"
哈哈,先使用經典的hello world帶進門
1.在“運行”鍵入cmd開啟dos視窗,並將目前的目錄跳轉到lua的目錄下(我的是在C:\lua-5.2_Win32_bin)
2.在lua目錄下建立一下文字檔(test.txt)並加入內容
print("hello world")
3.回到dos視窗,輸入執行命令lua52.exe test.txt
二、迴圈語句
在test.txt加入
for i=1,10,2 do
print("i = " .. i)
end
在dos視窗輸入命令lua52.txt test.txt
註:for語句中 i = 2, 10,2是表示從1開始,每次遞增2,到10結束(包含10)
三. 變數
lua 的變數是不需要宣告類型的
a = 5
b = "hello"
print(a.. " ".. b)
執行列印出來的結果如下
四、 table
lua的資料結構和數組都可以由table來實現,執行個體代碼如下:
aa = {}
aa["xx"] = 11
aa[3] = 22
print(aa["xx"] .." --".. aa[3])
輸出結果:
五、函數
lua 的函數文法為
function 函數名(參數)
實現...
end
下面為一段執行個體
function add(a, b)
sum = a + b
return sum
end
print("10 + 20 = "..add(10,20))
執行結果如下:
六、C/C++調用lua指令碼
1.建立工程
(1).使用VS2005建立一個C++ console工程
(2).將下載到的lua5_1_4_Win64_dll8_lib.zip解壓到工程中
(3).在工程中加入對lua51.lib的依賴,可以直接在代碼裡寫如#pragma comment(lib, "lua51.lib"),出可以將其到到工程設定的依賴項目中。
2.C/C++調用lua的流程
C/C++調lua流程大概如下:
/*開啟lua*/
lua_State *l = lua_open();
/*開啟全部的庫*/
luaL_openlibs(l);
/*執行lua指令碼、調用lua資訊*/
...
/*關閉lua*/
lua_close(g_l);
3. 建立一下test.txt的文本並寫入如下代碼
function add(a, b)
sum= a+b
return sum
end
a1 = "hello world"
b1 = 50
4. 在VC工程中寫入如下測試代碼,已經帶有較詳細注釋
#include "stdafx.h"
#include <windows.h>
#include <iostream>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#pragma comment(lib, "lua51.lib")
lua_State *g_l;
/*調用lua的add函數*/
int lua_add(int a, int b)
{
lua_getglobal(g_l,"add");
lua_pushnumber(g_l,a);
lua_pushnumber(g_l,b);
lua_call(g_l,2, 1);
/*get the result */
intsum = (int)lua_tonumber(g_l, -1);
lua_pop(g_l,1);
returnsum;
}
int _tmain(int argc, _TCHAR* argv[])
{
/*開啟lua*/
g_l= lua_open();
/*開啟全部的庫*/
luaL_openlibs(g_l);
/*執行lua指令碼,直接通過字串傳入*/
luaL_dostring(g_l,"print(100)");
/*執行lua指令碼,通過讀取設定檔*/
luaL_dofile(g_l,"test.txt");
/*調用lua的add函數*/
std::cout<<"calllua add(1,2) = "<<lua_add(1 , 2) <<std::endl;
/*擷取b1的值*/
lua_getglobal(g_l,"b1");
if(lua_isnumber(g_l,-1))
{
std::cout<<"b1= "<<lua_tonumber(g_l, -1)<<std::endl;
}
/*擷取a1的值*/
lua_getglobal(g_l,"a1");
if(lua_isstring(g_l,-1))
{
intnLen = 0;
std::cout<<"a1= "<<lua_tostring(g_l, -1, nLen)<<std::endl;
}
/*關閉lua*/
lua_close(g_l);
return0;
}
執行結果:
100
call lua add(1,2) = 3
b1 = 50
a1 = hello world
總結,學習所花時間,很多沒有學深學細,總體來說這門語言入門比較快,易學。沒有實際的項目經驗還不能深刻理解它的優勢所在。