Lua 指令碼呼叫 C 函式

2021-08-07 22:46:10 字數 1564 閱讀 8610

上篇說到 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棧狀態需要自己進行維護,若...