上篇說到 c 程式裡呼叫lua 函式,此篇講lua 指令碼裡呼叫c 函式。
lua要呼叫c 程式裡的函式,這些函式必須有同樣的原型:
typedef int (*luafunc)(lua_state *l);
結合工作上的業務來實現乙個簡單的lua 呼叫 c 函式的例子,業務是上這樣的,有一可攜式裝置向我們的裝置傳送資料,通過串列埠發出,經過232轉換485,接入我們的裝置,我們的應用程式收到資料後需要將資料傳送給lua,在指令碼檔案裡解析資料,然後lua 再將解析的資料返回給應用程式。
以下只是簡單的實現 c 呼叫 lua 函式,然後 lua 再呼叫 c 函式返回資料的過程:
有指令碼test.lua:
--定義了乙個全域性表
com = {}
function parsedata(str)
print("from c/c++ str: "..str);
com.lua_func(12, 23, 45);
end有c檔案main.c :
#include
#include
#include "lauxlib.h"
#include "lua.h"
#include "lualib.h"
/* 將要註冊給lua 的函式, 定義lua 傳回三個數值 */
int luafunc(lua_state *l)
int ret1 = (int)lua_tonumber(l, -3);
int ret2 = (int)lua_tonumber(l, -2);
int ret3 = (int)lua_tonumber(l, -1);
printf("line: %d, lua send back %d, %d, %d\n", __line__, ret1, ret2, ret3);
return 0;
}int main()
lua_pcall(l, 0, 0, 0); /* 前面這幾步都基本固定 */
lua_getglobal(l, "com"); /* 先找到表 */
if(lua_type(l, -1) != lua_ttable)
lua_pushstring(l, "lua_func"); /* 註冊函式 */
lua_pushcfunction(l, luafunc); /* 本人理解:往表 com 裡設定了com[key] = value, 即 com["lua_func"] = luafunc */
lua_settable(l, -3);
lua_getglobal(l, "parsedata");
if(lua_type(l, -1) != lua_tfunction)
lua_pushstring(l, "c call lua function");
lua_pcall(l, 1, 0, 0);
lua_close(l);
return 0;
}執行結果,如下截圖:
lua呼叫c函式
最近在進入lua程式設計的狀態,一度令我困惑的是,lua提供的功能少的可憐,跟自備電池的python相比,可說是簡陋了。連table的列印,都需要自己實現,也因此有了一打的第三方方案。後來我想明白了,以lua和c如此緊密的關係,只需要建立lua的binding,那麼豐富而效能強大的c庫資源完全可以為...
lua呼叫c函式
lua可以呼叫c函式的能力將極大的提高lua的可擴充套件性和可用性。對於有些和作業系統相關的功能,或者是對效率要求較高的模組,我們完全可以通過c函式來實現,之後再通過lua呼叫指定的c函式。對於那些可被lua呼叫的c函式而言,其介面必須遵循lua要求的形式,即 typedef int lua cfu...
lua呼叫C函式
lua採取的是利用棧進行互動,利用各種lua push 將不同的值壓入棧中,然後呼叫lua指令碼時自然會退棧取出引數執行,對於lua的虛擬機器來說,就像是發生了一次正常的函式呼叫。這裡採用的棧是lua棧,因為若是c棧的話呼叫lua的c api就會出錯了。需要注意的是,lua棧狀態需要自己進行維護,若...