激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - C語言模塊回調Lua函數的兩種方法

C語言模塊回調Lua函數的兩種方法

2020-04-22 10:47腳本之家 Lua

這篇文章主要介紹了C語言模塊回調Lua函數的兩種方法,本文講解了C保存函數對象、C訪問Lua全局環境兩種方法,需要的朋友可以參考下

lua和C通過虛擬棧這種交互方式簡單而又可靠,缺點就是C做棧平衡稍微會多寫一點代碼。 今天分享學到的C模塊回調Lua函數的兩種方法,都是炒冷飯,大俠勿噴。

1. C保存函數對象

C模塊可以通過注冊表保存Lua里面的對象,等適當時候取出再調用即可。

復制代碼 代碼如下:


static int lua_callback = LUA_REFNIL;

 

static int setnotify(lua_State *L)
{
  lua_callback = luaL_ref(L, LUA_REGISTRYINDEX);
  return 0;
}

static int testnotify(lua_State *L)
{
  lua_rawgeti(L, LUA_REGISTRYINDEX, lua_callback);
  lua_call(L, 0, 0);
}


luaL_ref把棧頂的值取出,放到指定的tabel中,然后返回一個索引(目測是數組的index)。 lua_rawgeti把之前保存的function對象取出,再由lua_call調用。

復制代碼 代碼如下:


function callback(  )
    print "Callback"
end

 

cb.setnotify(callback)
cb.testnotify()


2. C訪問Lua全局環境
第二種方法更簡便,C直接調用Lua中的函數,就像Lua調用C一樣

復制代碼 代碼如下:

static int testenv(lua_State *L)
{
  lua_getglobal(L, "defcallback");
  lua_call(L, 0, 0);
}


該方法的缺點就是如果C模塊獨立編寫,方法名就不太靈活。 用這種方法一般會在Lua端再封裝一層,以隔離全局環境。

 

3. 完整例子
cb.c

復制代碼 代碼如下:


#include <stdio.h>
#include <stdlib.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

 

static int lua_callback = LUA_REFNIL;

static int setnotify(lua_State *L)
{
  lua_callback = luaL_ref(L, LUA_REGISTRYINDEX);
  return 0;
}

static int testnotify(lua_State *L)
{
  lua_rawgeti(L, LUA_REGISTRYINDEX, lua_callback);
  lua_call(L, 0, 0);
}

static int testenv(lua_State *L)
{
  lua_getglobal(L, "defcallback");
  lua_call(L, 0, 0);
}

static const luaL_Reg cblib[] = {
  {"setnotify", setnotify},
  {"testnotify", testnotify},
  {"testenv", testenv},
  {NULL, NULL}
};

int luaopen_cb(lua_State *L)
{
  luaL_register(L, "cb", cblib);
  return 1;
}


test.lua

復制代碼 代碼如下:


require("cb")

 

function callback(  )
  print "Callback"
end

function defcallback()
  print "Predef callback"
end

cb.setnotify(callback)
cb.testnotify()
print "Done"
cb.testenv()

 

延伸 · 閱讀

精彩推薦
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
主站蜘蛛池模板: 久久久一区二区三区视频 | 成人羞羞在线观看网站 | 五月天影院,久久综合, | 叶子楣成人爽a毛片免费啪啪 | 国产羞羞视频在线观看免费应用 | 欧美一级高清免费 | 一级成人在线 | 日韩视频在线不卡 | 久久久一区二区三区四区 | 超碰九色 | 国产精品一区二区x88av | 宅男噜噜噜66国产在线观看 | a一级黄| 高清av免费 | 国产一区网址 | av手机在线电影 | 性高湖久久久久久久久aaaaa | 免费观看一级黄色片 | 宅男噜噜噜66国产免费观看 | 男女一边摸一边做羞羞视频免费 | 欧美国产91| 免费激情网址 | 高清成人在线 | 九九热免费在线观看 | www.热| 9999免费视频| 最污网站 | 狠狠干91 | 91伊人久久| 国产18成人免费视频 | 中文字幕亚洲欧美 | 一区免费 | 草免费视频 | a免费视频 | 毛毛片在线看 | 女人久久久www免费人成看片 | 国产欧美日韩在线不卡第一页 | 国产1区在线 | japanese massage tube| 日本黄网 | 日本aⅴ在线 |