主頁 > 知識庫 > Lua中調(diào)用C語言函數(shù)實例

Lua中調(diào)用C語言函數(shù)實例

熱門標(biāo)簽:漳州智云呼電話機器人 百度地圖標(biāo)注早餐區(qū)域 冀州市地圖標(biāo)注 清朝地圖標(biāo)注哈爾濱 怎么去除地圖標(biāo)注 個人怎么在地圖標(biāo)注需要的店鋪 武漢外呼防封系統(tǒng)多少錢 地圖標(biāo)注大廈 新岸線智能電銷機器人

在上一篇文章(C調(diào)用lua函數(shù))中,講述了如何用c語言調(diào)用lua函數(shù),通常,A語言能調(diào)用B語言,反過來也是成立的。正如Java與c語言之間使用JNI來互調(diào),Lua與C也可以互調(diào)。

當(dāng)lua調(diào)用c函數(shù)時,使用了和c調(diào)用lua中的同一種棧,c函數(shù)從棧中得到函數(shù),然后將結(jié)果壓入棧中。為了區(qū)分返回結(jié)果和棧中的其他值,每一個函數(shù)返回結(jié)果的個數(shù)。
這里有個重要的概念:這個棧不是全局的結(jié)構(gòu),每個函數(shù)都有自己的私有局部棧。哪怕c函數(shù)調(diào)用了lua代碼,lua代碼再次調(diào)用該c函數(shù),他們有各自獨立的局部棧。第一個參數(shù)的索引是1。
作為第一個例子,讓我們看看如何實現(xiàn)一個簡單的函數(shù),返回給定2個參數(shù)的和:

復(fù)制代碼 代碼如下:

static int l_plus(lua_State* L)
{
     lua_Integer a = lua_tointeger(L, 1);
     lua_Integer b = lua_tointeger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

每一個Lua注冊的函數(shù)都必須是這個原型,它已經(jīng)在lua.h中定義了:
復(fù)制代碼 代碼如下:

typedef int (*lua_CFunction) (lua_State *L);

由于c函數(shù)返回了一個int類型的返回值個數(shù)。因此,當(dāng)壓入返回值之前,不必要清理棧,lua會自動移除返回值下面的任何數(shù)據(jù)。

在lua中使用該函數(shù)之前,我們需要注冊它。使用lua_pushcfunction,它接受一個c函數(shù),然后在lua內(nèi)部創(chuàng)建一個函數(shù)類型的值來表示該函數(shù)。

復(fù)制代碼 代碼如下:

lua_pushcfunction(L, lua_plus);
lua_setglobal(L, "myplus");

一個專業(yè)點的寫法是,我們必須檢查它的參數(shù)類型:
復(fù)制代碼 代碼如下:

static int l_plus(lua_State* L)
{
     lua_Integer a = luaL_checkinteger(L, 1);
     lua_Integer b = luaL_checkinteger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

完整代碼:
復(fù)制代碼 代碼如下:

#include lua.h>
#include lauxlib.h>
#include lualib.h>
static int l_plus(lua_State* L)
{
     lua_Integer a = luaL_checkinteger(L, 1);
     lua_Integer b = luaL_checkinteger(L, 2);
     lua_pushinteger(L, a+b);
     return 1;
}

int main()
{
     lua_State *L = luaL_newstate();
     luaL_openlibs(L);
     lua_pushcfunction(L, l_plus);
     lua_setglobal(L, "myplus");
     if (luaL_dostring(L, "print(myplus(2,2))")) {
          lua_close(L);
          error("Failed to invoke");
     }
     lua_close(L);
     return 0;
}


(完)

您可能感興趣的文章:
  • Lua教程(二十):Lua調(diào)用C函數(shù)
  • Lua教程(四):在Lua中調(diào)用C語言、C++的函數(shù)
  • Lua教程(三):C語言、C++中調(diào)用Lua的Table示例
  • C++中調(diào)用Lua函數(shù)實例
  • Lua中調(diào)用C++函數(shù)實例
  • Lua調(diào)用自定義C模塊
  • Lua教程(十九):C調(diào)用Lua
  • Lua編程示例(六): C語言調(diào)用Lua函數(shù)
  • C語言中調(diào)用Lua函數(shù)實例
  • C語言與Lua之間的相互調(diào)用詳解

標(biāo)簽:金昌 儋州 天門 宣城 濰坊 天門 臺灣 德宏

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中調(diào)用C語言函數(shù)實例》,本文關(guān)鍵詞  Lua,中,調(diào)用,語言,函數(shù),實例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua中調(diào)用C語言函數(shù)實例》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua中調(diào)用C語言函數(shù)實例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章